C#调用C++编写的Test.dll运行时报无法加载DLL错误如何解决
问题排查解决步骤
- 确认DLL已复制到C#程序运行目录
C#程序运行时默认从自身所在的bin/Debug或bin/Release目录下搜索依赖DLL,你可以右键C#项目中添加的Test.dll文件,在属性面板中将「复制到输出目录」选项设置为「如果较新则复制」,也可以在C++项目的生成后事件中添加命令,编译完成后自动将DLL拷贝到C#项目的输出目录。 - 检查两个项目的目标平台架构是否匹配
C#项目的目标平台必须和C++ DLL的编译架构完全一致:- 如果C++ DLL编译为x64版本,C#项目的目标平台要设为x64,不能使用x86或开启了「首选32位」的AnyCPU
- 你可以分别右键两个项目打开属性页,C#项目在「生成」标签页修改目标平台,C++项目在「高级」标签页修改目标平台,两边保持统一即可。
- 排查C++ DLL的依赖项缺失
该报错也可能是Test.dll自身依赖的组件找不到导致的:- 不要将Debug模式编译的C++ DLL给Release模式的C#项目使用,Debug版C++ DLL依赖Debug版本的VC运行库,多数环境下默认没有安装
- 可以将C++项目的「代码生成」选项中的运行库设置为
/MT(Release模式)或/MTd(Debug模式),静态编译运行库避免外部依赖 - 也可以安装对应版本的VC++可再发行包来解决运行库缺失问题。
- 验证DLL导出函数名是否正确
你可以使用VS自带的dumpbin /exports Test.dll命令查看DLL的导出函数列表,确认导出函数名确实是analysis,如果导出名被修改,可以在DllImport特性中通过EntryPoint参数指定实际的导出函数名。
注意:你当前的C代码存在逻辑错误,你将传入的double类型数组直接赋值给int类型的vector,会直接读取double的二进制数据作为int值,输出结果和你预期的数值不一致,加载问题解决后需要将C代码中的
vector<int>改为vector<double>,或者将C#代码中的传参改为int数组。
内容的提问来源于stack exchange,提问作者Abdur Rakib
相关产品推荐
相关产品推荐

