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

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

时间: 2024-10-17 18:23:51

C#调用C++ dll导出函数提示找不到指定模块的相关文章

C#调用SCL2008 动态库SCL_API_cdecl.dll or SCL_API_Stdcall.dll,提示找不到指定模块

在公司用的联想 ThinkPad T430i,原装配置及系统,开机巨慢.按下开机键到登陆界面超过1分钟,再到桌面这个时间就难说了,多时有超过3分钟,进入桌面还要等待几分钟才能正常操作.新年过来向公司领导申请换固态硬盘,得到领导同意马上换了三星 120G的SSD,重装系统. 做为软件开发工程师,重装系统就意味着重装N多开发软件,特别是现在的上位机开发软件动则几个G! 重装系统后C#开发安装的是SharpDevelop 4.4.打开以前的工程运行提示“SCL_API_cdecl.dll,找不到指定模

VB调用标准Dll的时候提示找不到模块的问题

可能存在的情况: 1.Private Declare Function ReadFormInit Lib "iReadFormApi.dll" Alias "[email protected]" () As Integer 加下划线的函数名称不对 2.iReadFormApi.dll库调用的其他依赖库没有放到执行目录中!我就是因为这个原因导致了总是找不到模块的提示!!!

启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块

环境:windows8.1专业版 问题:启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块 每次开机都会弹出上图所示的信息. 经过查找是罗技鼠标驱动的问题:而把驱动卸载之后还是会弹对话框,更让人受不了的是C:\Windows\System32\logiLDA.DLL是存在的. 大部分的情况是系统盘不在C盘,而我的在C盘,同样出现这样的问题. 系统盘不在C盘的解决办法: 有遇到的没?Windows8不是安装在C盘,启动时提示LogiLDA.dll找不到-远

使用 __declspec(dllimport) 能够优化对DLL导出函数的调用.

使用 __declspec(dllimport) 能够优化对DLL导出函数的调用. 不使用时: [DLL] #ifdef THEDLL_EXPORTS #define THEDLL_API __declspec(dllexport) #else #define THEDLL_API __declspec(dllimport) #endif // THEDLL_API int fntheDll(void); [EXE] #include "..\\theDll\\theDll.h" #p

C# 遍历DLL导出函数

C#怎样去遍历一个由C++或E语言编写的本地DLL导出函数呢 只是在这里我建议对PE一无所知的人 你也许应先补补这方面的知识.我不知道为什么PE方面的 应用在C#中怎么这么少.我查阅过相关 C#的知识大概仅仅见一个人写过关于PE的应用 还仅仅是从PE信息中推断运行文件是X86还是X64方式 编译,难道C#程序猿真的非常差 真的仅仅能会点Asp.Net / MVC?想想看雪论坛那些玩inline-asm / inline-hook的牛牛 真是感到有非常大差距 只是任何语言 在我看来事实上都差点儿相

Dll 导出函数那些破事

经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系. VC++支持两种语言:即C/C++,这也是造成DLL导出函数差异的根源 我们用VS2008新建个DLL工程,工程名为“TestDLL” 把默认的源文件后缀 .CPP改为.C(C文件) 输入测试代码如下: 01 int _stdcall MyFunction(int iVariant) 02 { 03 return 0; 0

dll导出函数(摘)

目录 1.DLL中导出函数的方式有两种 2.查看dll导出函数; 3.__declspec(dllexport)和.def文件的区别. 1.DLL中导出函数的方式有两种: 方式一:在每一个函数声明前添加标识符: __declspec(dllexport) 比如:__declspec(dllexport) int add(int a, int b){return a+b;} 在这种方式下,如果调用该dll的是一个c++程序(同一个编译器的版本)是没有问题的.但是,如果调用该dll是一个其它语言的程

Java和Javac的使用时总提示找不到类模块的解决方案

1.场景: 争对网上的很多文章中javac编译与java运行的文章,有很多不明确的地方,使得在合适时发现很多坑.这里给大家作下简介. 2.Javac的使用注意: javac -d ./ ./InstallCert.java 其中-d表示要编译到哪里,加-d的目地是让后面加的java文件编译后,可以产生由package名称所确定的文件夹结构下的class文件.这样再运行java去执行时,就不会提示找不到类模块了. 3.Java的使用注意: java -classpath ./;c:\mylib.j

win10更新后文件夹无法移动和重命名,提示找不到指定文件

可以说,经历了那么多的windows系统,但是版本最多的,还是这个win10系统,但是不得不说,现在的win10系统在经历了众多版本的升级之后,也开始变得越发的完善了,不过其中的问题似乎也是蛮显著的,在一次又一次的升级过程中,Windows用户遇到的问题也是不少的. 最近有很多朋友发现了一问题,win10更新系统后出现文件夹无法移动和重命名,提示找不到指定文件的现象:          在 Windows 10 中,重命名文件或者文件夹总是自动闪掉,导致无法正常对文件夹或者文件夹进行重命名.或者