C#调用C++的dll 常见错误解决方法

C# 和 C/C++ 交互可以使用辅助工具:
    Depends:检测.exe/dll文件中的依赖库有哪些;
    
    PInvoke从功能上来说,只支持函数调用,在被导出的函数前面一定要添加extern “C来指明导出函数的时候使用C语言方式编译和链接的,这样保证函数定义的名字相同,否则如果默认按C++方式导出,那个函数名字就会变得乱七八糟,我们的程序就无法找到入口点了。

======================================================================
======================================================================
======================================================================

1、 异常错误: System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)     
    原因: 1、因为'任何 CPU'(Any CPU)的程序在64位的机器上就会用运行为64位,而64程序是不能加载32位dll的;
    解决方法:项目右键属性->项目设计器->生成->平台->把'默认设置(任何 CPU) (Any CPU) '改为x86了,解决方案中,“配置项目管理器”中,把平台修改为x86的;

    原因2: 可能是该dll中所应用的库/或者是依赖库不是32位dll;(使用对应的32位dll)
    解决方法:使用对应的dll库


2、异常错误: EntryPointNotFoundException 找不到入口点,在Dll “xxxx.dll”中,无法找到“xxxx”函数入口点
    原因1:c++源代码中的函数在编译成DLL后,函数的名称就发生了改变:会在函数的前后产生一些字符,所以找不到方法的入口点;
    解决方法:函数定义前加上: extern "C" __declspec(dllimport)  ;函数声明前:extern "C" __declspec(dllexport) ;

    原因2:C++中没有该函数的声明和定义;
    解决方法:查看C++代码中,是否有该函数声明和实现;C#代码引入dll时候的定义,函数名称是否错误;(两处地方函数名是否一致 )


3、异常错误:     System.DllNotFound Exception : 无法加载 DLL “xxx.dll”: 找不到指定的模块。(异常来自 HRESULT:0x8007000B)  
    原因:1、项目引用的dll缺失;
              2、引用的dll库项目依赖的dll缺失;
    解决方法:查找软件运行路径下,项目引用的dll库是否存在,不存在则添加;检查引用的dll库项目依赖的dll是否存在,不存在则添加到路径下;(注意版本 32/64位)


4、异常错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    原因:可能是因为C++和C#的参数类型对应问题;

    解决方法:排查参数类型是否对应;


你可能感兴趣的:(C++和C#,交互)