美文网首页
C# 导入DLL相关

C# 导入DLL相关

作者: 爱喝粥的西瓜 | 来源:发表于2020-12-18 09:33 被阅读0次

    记录以备查,感谢原作者

    C# 导入dll时CallingConvention的设置问题转自https://www.xuebuyuan.com/645807.html

    DllImportAttribute特性中的ExactSpelling作用

    比如:

    [DllImport("KERNEL.DLL", EntryPoint="MoveFileW", SetLastError=true, 
    CharSet=CharSet.Unicode, ExactSpelling=true, 
    CallingConvention=CallingConvention.StdCall)] 
    public static extern bool MoveFile(String src, String dst); 
    

    其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助.

    [DllImport("user32.dll", ExactSpelling = true)]
    public static extern int MessageBox(…); // ERROR!
    

    将ExactSpelling = true标记后上面的代码就会出错,因为在user32.dll中并没有MessageBox这个函数,只有MessageBoxA(ANSI版本)和MessageBoxW(Unicode版本),使用了ExactSpelling = true后将会对方法的签名进行严格的匹配,不符合的话将会有EntryPointNotFoundException产生。

    相关文章

      网友评论

          本文标题:C# 导入DLL相关

          本文链接:https://www.haomeiwen.com/subject/rlkxnktx.html