程序只在某些pc上工作,DLL丢失

Program works only on some pc, DLL missing?

本文关键字:工作 DLL 丢失 pc 程序      更新时间:2023-10-16

我用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提出的宝贵建议。