Environment.Exit(0) 在升级 Boost/.NET/编译器版本后挂起我的应用程序



我有一个WinForms应用程序,它使用几个C++/CLI DLL,这些DLL又与Boost链接。由于 Boost 或 std 库的一些古怪,当我正常退出此应用程序时(即使在加载后(,它也会由于双重释放C++区域设置方面而崩溃。为了解决这个问题,我开始使用 Process.GetCurrentProcess().Kill() ,但后来当我需要一个正常的退出来有一个 0 退出代码(即用于自动测试(时,我改用使用 Environment.Exit(0)

我刚刚将依赖项从使用 VS 2010 编译的 .NET 4 和 Boost 1.54 升级到使用 VS 2013 编译的 .NET 4.5 和 Boost 1.56。在升级之前,Environment.Exit(0)工作正常。升级后,它将无限期挂起。当我切换回Process.GetCurrentProcess().Kill()时,它退出正常(退出代码除外(。当我让它在没有任何解决方法的情况下正常关闭时,我仍然会遇到区域设置方面崩溃(所以我想 Boost 或 std C++ 中的问题没有得到修复(。所以我仍然需要解决方法才能工作。

我观察到的一些奇怪的事情:

  • 当我关闭程序并且它挂起时,然后打开"线程"选项卡进程资源管理器中的进程,进程完成关闭
  • 当我打开进程的"线程"选项卡,
  • 然后关闭程序时,它挂起;即使我从"线程"选项卡切换并返回它保持挂起
  • 在后一种情况下,有一个线程仍在运行(或等待(。线程的起始地址是"!"。克托尔"。InteropQonverter.dll对一些Boost代码的调用引起了我的注意,但我不知道它是否是一个准确的堆栈跟踪,因为这是一个发布版本。InteropQonverter.dll显然是我的C++/CLI DLL之一。但它不使用 boost::serialization AFAIK。

任何想法是什么导致了这种情况或如何解决它?

编辑:这是来自调试版本的堆栈跟踪,它具有相同的症状。它挂在我的 DLL 的 CRT 初始化中更有意义。它似乎抛出了异常,但我抓不到?

ntdll.dll!ZwDelayExecution()  + 0xa bytes   
KernelBase.dll!SleepEx()  + 0xb3 bytes  
ntdll.dll!RtlpExecuteHandlerForException()  + 0xd bytes 
ntdll.dll!RtlDispatchException()  + 0x38f bytes 
ntdll.dll!KiUserExceptionDispatch()  + 0x2e bytes   
KernelBase.dll!RaiseException()  + 0x3d bytes   
InteropQonverter.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved)  Line 415  C
InteropQonverter.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved)  Line 526 + 0x13 bytes   C
InteropQonverter.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved)  Line 477 C
mscoreei.dll!000007fef8405795()     
[Frames below may be incorrect and/or missing, no symbols loaded for mscoreei.dll]  
mscoree.dll!ShellShim__CorDllMain()  + 0xe1 bytes   
mscoree.dll!_CorDllMain_Exported()  + 0x37 bytes    
ntdll.dll!LdrShutdownProcess()  + 0x1d1 bytes   
ntdll.dll!RtlExitUserProcess()  + 0x90 bytes    
mscoreei.dll!000007fef83f3067()     
mscoreei.dll!000007fef83f3300()     
mscorlib.ni.dll!000007fef706188b()  
[Managed to Native Transition]  
mscorlib.dll!System.Environment.Exit(int exitCode) + 0x7b bytes 
IDPicker.exe!IDPicker.IDPickerForm.IDPickerForm_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) Line 1593 + 0x7 bytes   C#

我将其追踪到"无效字符串绑定"错误,这就是我首先添加 Kill((/Exit(( 调用的原因。然后,当我遵循以下解决方案时,我显然更改了一些内容:0xC0020001:字符串绑定无效。- 仅在 WPF 中出现(我/NOENTRY添加到我的 C++/ClI DLL 的链接器选项中(

最新更新