【问题标题】:Program works only on some pc, DLL missing?程序只能在某些电脑上运行,缺少 DLL?
【发布时间】:2012-12-17 16:55:12
【问题描述】:

我用 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#),其中设置了一些参数,然后后台工作人员调用
  • 执行其工作并使用 boost::thread 的 C++ DLL
    • 它会进行一些计算
    • 当它得到一些结果时,将它们写入文件
    • 继续计算等等
  • 主窗体有一个文件系统观察器,用于查找结果文件并对结果执行一些操作。

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

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

更新

原来我忘记在安装项目中包含一些 DLL。现在,包括他们在内,错误发生了变化。

现在,在与以前相同的时间点(在同一台计算机上)我收到另一个错误:

BadImageFormatException: 试图加载一个带有 格式不正确

我阅读了this article,但我在 C# 项目和 C++ DLL 中都设置了 x64,并且设置项目具有 TargetPlatform x64。有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好点,但我应该没问题。我刚刚编辑了我的问题。
    【解决方案2】:

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

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

    它提供了指示接下来需要安装什么的线索。

    【讨论】:

    • 非常感谢您的建议。现在我应该可以使用 DLL,但我还有另一个问题。
    【解决方案3】:

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

    有几个部署选项:您可能想阅读 MSDN 上的 this documentation

    【讨论】:

    • 不是 VCRedist 的 MSVCR/P dll 的一部分?
    • @KamilKlimek:是的。但 VCRedist 并不是唯一的选择。应用本地部署是另一个有效的选择。
    • 谢谢,但正如我评论 KamilKlimek 的回答,我应该可以接受部署。
    【解决方案4】:

    我终于找到了解决办法!

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2022-10-08
      • 1970-01-01
      相关资源
      最近更新 更多