2010-07-22

C#中用DllImport调用非托管代码

基本用法:调用系统的messagebox(位于user32.dll中)

using System;
using System.Runtime.InteropServices;
class Example
{    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}
至少要制定要导入的dll名称,可选字段:

  • CharSet:制定字符集
  • EntryPoint:制定入口点

     入口点用于标识函数在 DLL 中的位置。 在托管对象中,目标函数的原名或序号入口点将  标识跨越交互操作边界的函数。 此外,您可以将入口点映射到一个不同的名称,这实际上是将函数重命名。

以下列出了重命名 DLL 函数的可能原因:
  1. 避免使用区分大小写的 API 函数名
  2. 符合现行的命名标准
  3. 提供采用不同数据类型的函数(通过声明同一 DLL 函数的多个版本)
  4. 简化对包含 ANSI 和 Unicode 版本的 API 的使用
下面的示例演示如何使用 EntryPoint 字段将代码中的 MessageBoxA 替换为 MsgBox。

using System.Runtime.InteropServices;

public class Win32 {
    [DllImport("user32.dll", EntryPoint="MessageBoxA")]
    public static extern int MsgBox(int hWnd, String text, String caption,
                                    uint type);
}

No comments: