首先,注意相应的参数类型转换,这点自然是不用多说的。其次最好是采用如下的写法在代码中来引入dll文件中的方法,举例:
[DllImport("user32.dll",EntryPoint = "MessageBoxA",CharSet = CharSet.Ansi)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
private void button1_Click_1(object sender, EventArgs e)
{
MessageBox(this.Handle, "雷吼啊", "提示", 1);
}
虽然这样写也可以:
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
但是,我还是推荐第一种,使用EntryPoint 参数来指明dll文件中的函数名称,并且使用CharSet参数来指明封送字符集。
为什么?
还是拿win32api来进行举例,很多Win32 API函数都有ANSI和Unicode两个版本,就像上面的MessageBox方法,便有MessageBoxW和MessageBoxA两个版本,以W为结尾的代表着该函数以Unicode编码方式进行参数封送,以A为结尾的代表着该函数以ANSI编码方式进行参数封送,我们之所以能够直接写为第二种的简写方式,是因为默认封送字符集被认定为CharSet.Ansi,在这种情况之下,编译器首先通过名称MessageBox却寻找方法,找不到,追加为MessageBoxA再次寻找。
为了防止因为调用的函数体与封送字符编码不符而导致的乱码问题,所以推荐将调用的函数以及其相当于的字符编码都进行明确声明。