【发布时间】: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