【问题标题】:exception HRESULT: 0x800700C1 when executing c# application referencing native c++ lib with boost异常 HRESULT: 0x800700C1 执行 c# 应用程序时使用 boost 引用本机 c++ lib
【发布时间】:2011-12-26 22:20:40
【问题描述】:

我正在运行一个引用 C++\CLI 包装器项目的 C# 应用程序,该包装器项目又引用依赖于 Boost 1.47 库的本机 c++ 项目(链接到 ...vc100-mt-gd-1_47.lib 形式的文件)

所有库都是静态链接的,一切都编译得很好。执行 C# 应用程序会导致异常: “...不是有效的 Win32 应用程序。(来自 HRESULT 的异常:0x800700C1)。”声称某些依赖项在某处丢失。

C# 应用程序配置为 x86 平台,而所有其他项目都是 Win32,包括 boost 的二进制文件。

编辑:在添加使用 Boost 库之前,它确实有效

如何找出问题所在?

【问题讨论】:

  • 这不是缺少依赖类型的错误。必须是平台目标设置。
  • 即使在错误描述中如此说明?
  • 也许 AnyCPU 是正确的设置,很难从你的描述中猜到。使用 SysInternals 的 ProcMon.exe 工具来验证您的假设。您将看到它加载了您可能不需要假定为本机代码依赖项的任何 DLL。当平台目标为 x86 时,64 位原生 DLL 将触发此异常。
  • 我可以提供哪些详细信息来提供帮助?另外,请注意关于提升是原因的编辑
  • @Seth,是的,我有。我不确定为什么会发生这种情况,但是当 CLR 项目引用使用 boost 的本机项目时,boost 库必须动态链接。静态链接由于某种原因失败。

标签: visual-studio-2010 boost c++-cli


【解决方案1】:

这是已知问题。原因是 Boost::Thread 中使用了线程本地存储 (TLS)。要修复它,您应该禁用 libboost_thread-vcXXX-mt-1_XX.lib 并强制链接器将您的 C++/CLI 程序集与 boost_thread-vcXXX-mt-1_XX.lib (boost_thread-vcXXX-mt-1_XX.dll 的存根)链接.

或者您可以创建自己的 DLL 并将其与 libboost_thread-vcXXX-mt-1_XX.lib 链接。然后,您可以将您的 C++ DLL 与 C++/CLI 程序集链接起来。

【讨论】:

    【解决方案2】:

    前几天尝试在我的 Visat 64 位 PC 上运行 IIS 应用程序时遇到了这个令人讨厌的错误:

    错误:不是有效的 Win32 应用程序。 (来自 HRESULT 的异常:0x800700C1)

    解决方案:

    在 IIS 7 中单击应用程序池(左侧 {machine_name} 下) 选择您的应用程序池,然后单击右侧的高级设置。 列表中的第二个设置:启用 32 位应用程序 - 必须设置为 True。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2013-09-29
      • 2020-04-27
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多