C#调用C++ dll导出函数提示找不到指定模块 by:凉游浅笔深画眉 / Net7Cracker

本文介绍了使用VS2013编译的C++动态链接库(DLL)在不同环境下调用遇到的问题及解决方案。通过调整.NET项目的生成设置和编译选项,解决了DLL调用错误及依赖缺失等问题。

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

在X64系统上,用VS2013编写了一个C++动态链接库,里面提供了一个导出函数SGFYS。

 

 

 编译为DLL之后,我们用C#对其动态链接库进行调用,调用代码如下:

此时会被提示,试图加载不正确的格式。我们对该.NET项目属性进行配置,右键该项目--属性--生成--目标平台修改为(x86)

之后再次调用,已经可以被正确调用。

此时我们将该程序放到XP下运行,会报错“找不到指定模块”。

我们用 Dependency walker加载该DLL,发现缺少依赖MSVCR120D.DLL

 

导致上述问题的原因是运行库动态编译和静态编译的问题。dll动态加载有个好处,它可以减少生成的exe文件的体积,但是缺点就是如果对应的系统环境变量或者exe所在的目录里面找不到其所需要的dll文件的话,程序就会拒绝执行。而静态编译就是把所有需要的库都静态编译到exe文件里面,这样就可以在所有的系统平台上都能运行,但它也有一个缺点,就是生成的exe文件因为已经带了部分库的代码,所以体积会相对动态编译出来的exe大(具体大多少要根据库的内容才能确定)。


解决方法:

右击相应的项目,选择“属性”,在项目属性页中的“配置属性”下面的“C/C++”下面的“代码生成”一项,由默认的“多线程调试DLL(/MDd)”,改成“多线程 (/MT)”,确定之后,重新生成项目即可。这样所得的exe文件就是静态编译了。 

 

转载于:https://www.cnblogs.com/fuhua/p/5880262.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值