• λ我爱Aspx >> Asp.Net >> 在 C# 中通过 P/Invoke 调用Win32 DLL
  • 在 C# 中通过 P/Invoke 调用Win32 DLL

  • :未知  Դ:internet  :2007-5-20 16:49:09  ؼ:c#
  • 为了调用 MessageBeep,您需要在 C# 中将以下代码添加到一个类或结构定义中:

    [DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType);

    令人惊讶的是,只需要这段代码就可以使托管代码调用非托管的 MessageBeep API。它不是一个方法调用,而是一个外部方法定义。(另外,它接近于一个来自 C 而 C# 允许的直接端口,因此以它为起点来介绍一些概念是有帮助的。)来自托管代码的可能调用如下所示:

    MessageBeep(0);

    请注意,现在 MessageBeep 方法被声明为 static。这是 P/Invoke 方法所要求的,因为在该 Windows API 中没有一致的实例概念。接下来,还要注意该方法被标记为 extern。这是提示编译器该方法是通过一个从 DLL 导出的函数实现的,因此不需要提供方法体。

    说到缺少方法体,您是否注意到 MessageBeep 声明并没有包含一个方法体?与大多数算法由中间语言 (IL) 指令组成的托管方法不同,P/Invoke 方法只是元数据,实时 (JIT) 编译器在运行时通过它将托管代码与非托管的 DLL 函数连接起来。执行这种到非托管世界的连接所需的一个重要信息就是导出非托管方法的 DLL 的名称。这一信息是由 MessageBeep 方法声明之前的 DllImport 自定义属性提供的。在本例中,可以看到,MessageBeep 非托管 API 是由 Windows 中的 User32.dll 导出的。

    到现在为止,关于调用 MessageBeep 就剩两个话题没有介绍,请回顾一下,调用的代码与以下所示代码片段非常相似:

    [DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType);

    Ҷƪл˵?
  • һƪ防止对 Visual Basic .NET 或 C# 代码进行反相工程
    һƪC# 泛型简介