【问题标题】:c++ - cli application compiled on Windows 8 can not start on Windows Server 2008 R2 if boost/thread.hpp is includedc++ - 如果包含 boost/thread.hpp,在 Windows 8 上编译的 cli 应用程序无法在 Windows Server 2008 R2 上启动
【发布时间】:2012-11-14 17:04:42
【问题描述】:

我的应用程序可以在我的 Windows 8 笔记本电脑上正常启动。 但是我无法在 Windows Server 2008 R2 上启动它。出现以下错误:

The exception unknown software exception (0xe0434352) occured in the application at location 0xfd5ecaed.

在命令行中打印以下内容:

Unhandled Exception: Cannot print exception string because Exception.ToString() failed.

我的解决方案包含一个我正在尝试使用的 c++-cli 项目,如果我不使用它,那么一切正常,因此仅评论这一行会有所帮助:

// private static CliAdapterMain cliAdapter = new CliAdapterMain();

我试过了:

  • 在目标机器上修复 .NET Framework 4.5
  • 修复/重新安装 VS 2012 Update 1 Redistributable(x86 和 x64,版本 11.0.51106.1)
  • 将我的 VS2012 更新为 Update 1 重新编译的项目
  • 没有 Windows 挂起的更新,尝试多次重启系统

Dependency Walker 声称缺少以下 DLL:GPSVC.DLL IESHIMS.DLL MF.DLL MFPLAT.DLL MFREADWRITE.DLL WLANAPI.DLL 但是它们存在于目标计算机上,例如这里

c:\Windows\winsxs\amd64_microsoft-windows-grouppolicy-base_31bf3856ad364e35_6.1.7601.17514_none_8649674dfda23046\gpsvc.dll

也许我可以尝试手动重新注册丢失的 dll,但我不认为这真的是一个问题。查看一个异常,似乎有些东西坏了,而不是缺少什么。

更新:来自 Windows 日志:

Va.MBClient.exe 框架版本:v4.0.30319 说明:进程因未处理的异常而终止。 异常信息:System.TypeInitializationException 堆: 在 Va.MBClient.Program.Main(System.String[])

所以我猜private static CliAdapterMain cliAdapter = new CliAdapterMain(); 失败了,但我不知道为什么。

upd 玩了一下我的应用程序。最后我发现只有一行代码导致失败。这是#include <boost/thread.hpp>。为什么这不起作用?我正在使用最新版本的 boost (1.52),但我确实在我的 Windows 8 机器上构建了它。我应该为 Windows Server 2008 R2 重建一切吗?我应该在 Windows Server 2008 R2 上构建整个项目吗?

【问题讨论】:

  • 也许这会有用:stackoverflow.com/questions/5670248/boost-mutex-c-cli-problems 我也遇到了同样的问题。我通过将所有使用 boost::thread 的代码移动到单独的本机 DLL 来解决它。
  • @pogorskiy 奇怪的是我可以在 Windows 8 上运行,但不能在 Windows Server 2008 R2 上运行。因为通过这个链接人们说 boost 和 CLR 不兼容。
  • 问题是boost的其他部分呢?如果我避免使用 boost::thread,boost 库的其他部分是否可以与 clr 一起正常工作?
  • 他们写道,错误是由特定的#pragmas (#pragma section(".CRT$XIU",long,read)__declspec(allocate(".CRT$XIU"))_PVFV p_tls_prepare = on_tls_prepare;) 引起的。也许行为可能因平台而异。我努力避免使用与系统相关的部分(例如 boost::thread 或 boost::asio)来避免潜在的问题。最好将它们移动到单独的本机 DLL
  • @pogorskiy 我想使用 boost,因为将来我需要移植到现在需要在 Windows 上启动的 Linux 应用程序。

标签: visual-c++ boost c++-cli boost-thread


【解决方案1】:

由于在Windows Sever中,部分功能默认未开启,需要自行添加Windows Media Services和Wireless LAN Service才能取回Dll。

可以参考MSDN

【讨论】:

  • 你确定我需要那个吗?我不使用任何“wlan”或类似的东西。
  • 这是基于依赖工作者报告的,我不知道代码中调用了什么。
  • 我明白了。有时即使依赖工作人员报告缺少 dll,应用程序也能正常工作。我将挖掘“0xe0434352”错误代码问题。
  • 使用Windbg,它可以帮助你。
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 2012-03-25
  • 2016-04-11
  • 1970-01-01
  • 2016-12-21
  • 2012-12-16
  • 2012-04-15
相关资源
最近更新 更多