3

我用 VS10 编写了以下项目:

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

编译(三个项目中的每一个都为 x64)没问题,该程序可以在我的电脑(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。任何的想法?

4

4 回答 4

3

目标计算机上缺少 VCRedist 包。它应该在 VS SDK 目录中可用。此外,您可能需要在目标机器上安装 .Net Framework(.Net Framework 包含 VCRedist 包)。如果您没有这些的安装文件,可以在 microsoft 网站上找到它们,即 VC10Redist for x64 在这里

于 2013-01-03T10:33:30.210 回答
3

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

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

它提供了指示随后需要安装什么的线索。

于 2013-01-03T10:40:38.357 回答
2

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

有几个部署选项:您可能想阅读MSDN 上的此文档

于 2013-01-03T10:36:21.053 回答
1

我终于找到了解决方案!

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

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

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

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

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

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

于 2013-01-05T10:02:22.983 回答