c#通过动态链接库的方式调用c/c++dll文件时的注意事项

首先,注意相应的参数类型转换,这点自然是不用多说的。其次最好是采用如下的写法在代码中来引入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方法,便有MessageBoxWMessageBoxA两个版本,以W为结尾的代表着该函数以Unicode编码方式进行参数封送,以A为结尾的代表着该函数以ANSI编码方式进行参数封送,我们之所以能够直接写为第二种的简写方式,是因为默认封送字符集被认定为CharSet.Ansi,在这种情况之下,编译器首先通过名称MessageBox却寻找方法,找不到,追加为MessageBoxA再次寻找。

为了防止因为调用的函数体与封送字符编码不符而导致的乱码问题,所以推荐将调用的函数以及其相当于的字符编码都进行明确声明。

你可能感兴趣的:(.net,c#)