程序只在某些电脑上运行,缺少DLL文件?

3
我使用VS10编写了以下项目:
  • 一个调用C++未托管dll的C#(.net 4.0)程序,该dll使用boost::thread
  • 一个安装程序,其中包括C#可执行文件、C++ dll、boost::thread dll和一些其他文件。此外,在安装过程中会检查是否安装了.net 4.0框架,如果没有,则会下载。
三个项目都已编译(每个项目都是x64),并且在我的PC上(Windows 7 64位)运行正常。 我在其他一些计算机上测试了该程序(都是Windows 7 64位),发现:
  • 在安装了VS10和Boost的计算机上,程序可以正常工作
  • 在没有安装VS10和Boost的计算机上,程序会在C++ Dll中出现错误
我认为问题在于缺少某个boost Dll。我是对的吗? 或者问题可能与VS有关吗?
编辑: 我必须提到程序的结构如下:
  • 主窗体(使用C#编写),用于设置一些参数,然后后台工作器调用
  • C++ DLL 执行其操作并使用 boost::thread
    • 它执行一些计算
    • 当获取一些结果时,将其写入文件
    • 继续进行其计算等操作
  • 主窗体具有一个 FileSystemWatcher,用于查找结果文件并对结果执行某些操作。

另外,在发生错误时,主窗体会正确加载,并且可以设置参数。 错误发生在后台工作器开始工作时(调用 C++ DLL)。

因此,我相当确定框架安装没有问题。

更新:

事实证明,我忘记在设置项目中包含一些 DLL。现在,将它们包括进去后,错误已更改。

现在,在与之前相同的点位置(以及在相同的计算机上)我得到另一个错误:

BadImageFormatException: 尝试加载格式不正确的程序

我阅读了这篇文章,但是我已经在C#项目和C++ DLL中都设置了x64,并且安装程序的TargetPlatform也是x64。有什么想法吗?
4个回答

3

目标机上缺少VCRedist软件包。它应该在VS SDK目录中可用。另外,您可能需要在目标机上安装.Net Framework(.Net Framework 包含VCRedist软件包)。如果您没有这些的安装文件,它们可以在Microsoft网站上获得,例如x64版本的VC10Redist可以在这里找到。


好的观点,但我应该可以处理这个问题。我刚刚编辑了我的问题。 - 888

3
在这种情况下,我使用工具Dependency Walker。启动它并选择您的可执行文件以查找缺失的库。它会提供线索,指示需要安装什么。

1
非常感谢您的建议。现在我应该可以处理DLL了,但我还有另一个问题。 - 888

2
如果你的C++ DLL与CRT进行了动态链接,那么你还必须在目标机器上部署VC++ CRT DLL's,即MSVCR100.DLL和C++的MSVCP100.DLL(它们已经在你安装了VS2010的开发机器上可用,因此在该机器上,你的C++ DLL可以正常加载;但是你不能假设在客户机器上可用CRT/C++ DLL's)。
有几个部署选项:你可能想阅读MSDN上的this documentation

MSVCR/P DLL是否是VCRedist的一部分? - Kamil Klimek
@KamilKlimek: 是的,它们是。但VCRedist并不是唯一的选择。应用程序本地部署是另一种有效的选项。 - Mr.C64
谢谢,但是正如我在KamilKlimek的回答中所评论的,我应该可以处理部署。 - 888

1

我终于找到了解决方案!

C++ DLL需要mpfr库进行正确舍入的多精度浮点计算。

我包含了(真是丢人!)错误版本的库(x86),这是错误的动机:

BadImageFormatException:尝试加载具有不正确格式的程序

然后,在所有电脑上(三台不同的电脑!)程序都正常运行,其中同时存在(不幸和误导性的巧合):

  • 安装了Boost和VS10
  • Path环境变量中包含一个文件夹中的x64版本库。

因此,以某种方式,程序找到了正确版本的DLL。

在安装项目中包含正确版本的库解决了问题。感谢Kamil Klimek、Stephane Rolland和Mr.C64提供的宝贵建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接