程序只在某些pc上工作,DLL丢失
Program works only on some pc, DLL missing?
我用VS10编写了以下项目:
- 一个c# (.net 4.0)程序,调用
- 一个c++非托管dll,它使用boost::thread 一个安装项目,包括c#可执行文件、c++ dll、boost::thread dll和其他一些文件。此外,在安装过程中有一个检查,如果框架。net 4.0安装,如果没有,它将下载。
编译(三个项目中的每个项目都是x64)是ok的,并且该程序在我的pc (Windows 7 64位)上运行。我在其他一些电脑上测试了这个程序(都是Windows 7 64位),我注意到:
- 在VS10和Boost的程序工作
- 在没有VS10和Boost的情况下,程序在c++ Dll 中给出错误
我认为问题是一些boost Dll缺失。我说的对吗?或者问题可能与VS有关?
编辑:
我必须提到程序的结构如下:- 主要形式(c#),其中设置了一些参数,然后后台工作程序调用
- c++ DLL,它使用boost::thread来完成它的工作
- 它做一些计算
- 当它得到一些结果时,将它们写入文件
- 继续计算,等等
- 主表单有一个文件系统监视器,它查找结果文件并对结果做一些事情。
另外,当我得到错误时,主表单正确加载,参数可以设置。这个错误发生在后台工作者开始他的工作时(调用c++ DLL)。
所以我很确定框架安装没有问题。
:
原来我忘了在安装项目中包含一些dll。现在,包括它们,错误改变了。
现在,在相同的点(在相同的计算机上),我得到了另一个错误:
BadImageFormatException:试图用不正确的格式
我读了这篇文章,但我在c#项目和c++ DLL中都设置了x64,设置项目为TargetPlatform x64。任何想法?
目标机上缺少VCRedist包。它应该在VS SDK目录中可用。此外,您可能需要在目标机器上安装。net Framework。. Net框架包含VCRedist包)。如果你没有这些软件的安装文件,你可以在微软的网站上找到,比如VC10Redist for x64在这里
在这种情况下,我使用工具Dependency Walker
启动它并选择可执行文件以发现丢失的库。
如果您的c++ DLL 动态地链接到CRT,那么您必须在目标机器上也部署vc++ CRT DLL,即MSVCR100.DLL
和c++的MSVCP100.DLL
(它们已经在您的开发机器上可用,在那里您已经安装了VS2010,所以在那台机器上您的c++ DLL加载良好;但是你不能假设在你的客户端的机器上 CRT/c++ DLL是可用的)。
有几个部署选项:您可能希望在MSDN上阅读此文档
我终于找到解决办法了!
c++ DLL需要mpfr库来进行正确舍入的多精度浮点计算。
我包含了不正确的库版本(x86),这就是导致错误的原因:
BadImageFormatException:试图加载格式不正确的程序
那么在所有运行正常的计算机(三台不同的计算机!)中,有两种情况(不幸的和误导性的巧合):
- Boost和VS10安装和
- 包含在Path环境变量中的文件夹中的库的x64版本。所以,在某种程度上,程序找到了正确的DLL版本。
在安装项目中包含正确版本的库修复了这个问题。感谢Kamil Klimek、Stephane Rolland和Mr.C64提出的宝贵建议。
- 导入库可以跨dll版本工作吗
- 名为DLL的C++windows服务程序工作不正常
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- PlayFunction在DLL中不起作用,但在独立的exe中工作
- Windows API "CreateWindowEx" 在 Python (3.6.8) 64 位使用的 DLL 中工作吗?
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- C++ Dll 无法在未安装 Visual Studio 的系统上工作
- DLL函数在VBA环境中不起作用,但在Excel VBA中工作
- 在dll中静态对象的破坏之前,要终止工作线程(但不是.exe)
- Dll进程挂钩不工作
- 运行在DLL中的工作线程在应用程序关闭时被终止,然后才能正常关闭它们
- 获取 dll include 以在 Visual Studio 中工作
- C++:无法使用 regsvr32 注册我的 DLL,但可以通过 IDE 工作
- C++Dll注入——Hello world Dll只有在注入到注入它的相同.exe中时才能工作
- 如何使 *.dll WinAmp 插件在朋友电脑上工作
- 为什么有些函数需要作为DLL文件注入才能工作
- 导入 DLL 的工作方式不同(VS2003 到 VS2010,多线程到多线程 DLL)
- 以下代码是如何工作的(从DLL加载动态类)
- C# IteropServices with C++ dll - 在excel中工作
- DLL 导致"Microsoft Excel has stopped working"但它在 Win32 控制台应用中工作正常