码迷,mamicode.com
首页 > 编程语言 > 详细

C#调用C++ dll导出函数提示找不到指定模块

时间:2016-09-18 06:35:00      阅读:418      评论:0      收藏:0      [点我收藏+]

标签:

在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文件就是静态编译了。 

技术分享

 

C#调用C++ dll导出函数提示找不到指定模块

标签:

原文地址:http://www.cnblogs.com/fuhua/p/5880262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!