DllImport System.DllNotFoundException 问题分析与解决

229 篇文章 2 订阅

自己实验了一下,感觉以下几种解决办法是可行的:
方法一:
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:

msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest

把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。

其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!

方法二:
修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。

方法三:

工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc”
这样生成的exe文件应该就可以在其他机器上跑了。

方法四:

你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装

 

C#调用c++制作的DLL时,一些参数的赋值问题如char *,结构体

c++ dll中的原型
int test(char* xm,char* fa,UINT &VerNum,double Mile,char *SurvMile);
c#调用时
 [DllImport(@"Test2.DLL")]
public static extern int test(string xm,string fa,ref UInt32 VerNum,double Mile, StringBuilder SurvMile);
//----------------------------------------------------------------------------------------
最近做C++大作业,界面是用C#构建,而程序处理核心使用n ative C++写的DLL,整个程序用VS2010编译,最初在我们三人的电脑开发测试时发现一切运行正常,但是当发给别人运行的时候,当WPF做的界面调用C++编写的DLL的时候,就会弹出System.DllNotFoundException错误,我把DLL放在System32和exe所在目录下发现问题依旧。

         翻了很多中文网站似乎没有找到解决方案...后来在某外国网站看到,出现这种原因的可能性有:

1. DLL函数是否有正确导出。这个我在有的人的电脑可以运行,这说明函数已经正确导出了。

2. 导入的方法是否正确。

               [DllImport( "GDIPlusLibrary.dll", EntryPoint="ImageEffects" )]

               public static extern IntPtr ImageEffects( IntPtr bitmap, ref Parameter param );

导出方法如上,在开发者的电脑可以运行,所以上述问题不予考虑。

3. DLL有没有依赖什么其他DLL,仔细看了C++代码,没有调用什么其他DLL。

那么问题究竟在何处?后来按大家一贯思路,用Depends查看DLL需要什么运行库,竟然发现DLL需要msvcr100.dll!我明明没有调用它,也没选择MFC,为什么会这样。

如果出现这种情况,那么这个DLL运行的电脑需要安装 VC 2010 运行库,后来用VS 2008重新编译了这个DLL,现在只要装了VC++ 2008 Runtime Library的电脑都不会出错了。

总结:
         出现匪夷所思的DLL无法加载的问题,看看是否是DLL需要其他DLL,尽管你没调用其他DLL,但是不保证你的编译器偷偷帮你生成了调用其他DLL的代 码。出现上述问题,可以尝试安装VC运行库,应该就可以解决问题!
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值