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

DllNotFoundException

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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缺失;可以使用Depends.exe工具查
    解决方法:检查引用的dll库项目依赖的dll是否存在,不存在则添加到路径下;(注意32/64位)
**************************************************************************************************************

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

    异常原因:可能是因为C++和C#的参数类型对应问题;
    解决方法:排查参数类型是否对应;

**************************************************************************************************************

其实在调用C++的dll的时候,可以调用简单的方法和数据类型,可以快速验证dll库是否能被C#程序所调用和排查问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值