C# 和 C/C++ 交互可以使用辅助工具:Depends(检测.exe/dll文件中的依赖库有哪些)
PInvoke从功能上来说,只支持函数调用,在被导出的函数前面一定要添加extern “C来指明导出函数的时候使用C语言方式编译和链接的,这样保证函数定义的名字相同,否则如果默认按C++方式导出,那个函数名字就会变得乱七八糟,我们的程序就无法找到入口点了。
**************************************************************************************************************
1、 异常错误:System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
异常原因:因为'任何 CPU'(Any CPU)的程序在64位的机器上就会用运行为64位,而64
位程序是不能加载32位dll的;
解决方法:项目右键属性->项目设计器->生成->平台->把'默认设置(任何 CPU)(Any CPU) '改
为x86了,解决方案中,“配置项目管理器”中,把平台修改为x86的;
异常原因:可能是该dll中所应用的库/或者是依赖库不是32位dll;(使用对应的32位dll)
解决方法:使用对应的dll库
**************************************************************************************************************
2、异常错误:EntryPointNotFoundException 找不到入口点,在Dll “xxxx.dll”中,无法找到“xxxx”函数入口点
异常原因:C++源代码中的函数在编译成DLL后,函数的名称就发生了改变:会在函数的前后产
生一些字符,所以找不到方法的入口点;
解决方法:函数定义前加上:extern "C" __declspec(dllimport) ;
函数声明前:extern "C" __declspec(dllexport) ;
异常原因:C++中没有该函数的声明和定义;
解决方法:查看C++代码中,是否有该函数声明和实现;C#代码引入dll时候的定义,函数名称
是否错误;(两处地方函数名是否一致 )
**************************************************************************************************************
3、异常错误: System.DllNotFoundException :无法加载 DLL “xxx.dll”: 找不到指定的模块。(异常来自 HRESULT:0x8007000B)
异常原因:项目引用的dll缺失;
异常原因:项目引用的dll缺失;
解决方法:查找软件运行路径下,项目引用的dll库是否存在,不存在则添加;
异常原因:引用的dll库项目依赖的dll缺失;可以使用Depends.exe工具查
解决方法:检查引用的dll库项目依赖的dll是否存在,不存在则添加到路径下;(注意32/64位)
**************************************************************************************************************
4、异常错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
异常原因:可能是因为C++和C#的参数类型对应问题;
解决方法:排查参数类型是否对应;
**************************************************************************************************************
其实在调用C++的dll的时候,可以调用简单的方法和数据类型,可以快速验证dll库是否能被C#程序所调用和排查问题。