程序只适用于某些PC,DLL丢失了吗?

时间:2013-01-03 10:29:50

标签: c# c++ visual-studio-2010 dll boost-thread

我用VS10写了以下项目:

  • 调用
  • 的C#(。net 4.0)程序
  • 一个C ++非托管DLL,它使用了boost :: thread
  • 一个安装项目,包括C#可执行文件,C ++ DLL,boost :: thread dll和其他一些文件。此外,在安装过程中还会检查是否安装了框架.net 4.0,如果没有,则会进行下载。

编译(三个项目中的每个项目的x64)都可以,程序可以在我的电脑上运行(Windows 7 64位)。 我在其他一些计算机(所有Windows 7 64位)上测试了该程序,我注意到:

  • 在VS10和Boost的程序中运行
  • 在没有VS10和Boost的程序中,程序在C ++ Dll中出现错误

我认为问题在于缺少一些提升Dll。我对吗? 或者问题可能与VS有关?

修改

我必须提到程序的结构如下:

  • 主要表单(C#),其中设置了一些参数,然后backgroudworker调用
  • 执行其内容并使用boost :: thread的C ++ DLL
    • 它做了一些计算
    • 获得一些结果时,将其写入文件
    • 继续其计算等等
  • 主窗体有一个filesystemwatcher,它会查找结果文件并对结果做一些处理。

此外,当我收到错误时,主窗体正确加载并且可以设置参数。当backgroundworker开始工作时(调用C ++ DLL)会发生错误。

所以我很确定框架安装没有问题。

更新

事实证明,我忘了在安装项目中包含一些DLL。现在,包括他们在内的错误发生了变化。

现在,和以前一样(在同一台计算机上)我得到另一个错误:

  

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

我读了this article,但我在C#项目和C ++ DLL中都设置了x64,而安装项目的目标是TargetPlatform x64。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

目标计算机上缺少VCRedist包。它应该在VS SDK目录中可用。您还可能需要在目标计算机上安装.Net Framework(.Net Framework包含VCRedist包)。如果你没有那些安装文件,那么它们可以在微软网站上获得,即x64的VC10Redist是here

答案 1 :(得分:2)

如果您的C ++ DLL 动态链接到CRT,那么您还必须在目标计算机上部署VC ++ CRT DLL,即MSVCR100.DLL和C ++的MSVCP100.DLL(它们已经安装在你的开发机上,你安装了VS2010,所以在那台机器上你的C ++ DLL加载正常;但你不能假设你的客户端的机器上 CRT / C ++ DLL可用)。

有几个部署选项:您可能希望在MSDN上阅读this documentation

答案 2 :(得分:2)

在这种情况下,我使用工具Dependency Walker

启动它并选择您的可执行文件以发现丢失的库。

它提供了表明安装所需内容的线索。

答案 3 :(得分:1)

我终于找到了解决方案!

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

我包括(羞辱我!)不正确的库版本(x86),这是错误的动机:

  

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

然后在程序还可以的所有计算机(三台不同的计算机!)中都存在(不幸和误导性的巧合):

  • 安装了Boost和VS10,
  • Path环境变量中包含的文件夹中的x64版本的库。 所以,在某种程度上,程序找到了正确的DLL版本。

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