The string binding is invalid.
当我尝试关闭一个相当复杂的应用程序时会发生这种情况,该应用程序由使用 C++/CLI DLL 的 C# EXE 组成,而不是依次引用多个 C++ 本机静态库和 DLL。(我使用的是 VS2013 和 Boost 1.55。)
出现问题的原因是_atexit
(在 DLL 终止时)试图调用_t2m@???__Fep@?1???$get_static_exception_object@Ubad_exception_@exception_detail@boost@@@exception_detail@boost@@YA?AVexception_ptr@1@XZ@YAXXZ@?A0x8b93c95f@@YAXXZ
,这是一个本地到托管的 thunk,并且 CLR 可能已经被关闭。
我的主要问题是为什么在本机终止处理程序中注册托管 thunk,因为根据定义它不能工作。一个相关的问题是为什么要为这种类型生成托管 thunk,因为据我所知#include
,任何可以引用这种类型的东西要么在非/clr
编译文件中,要么#pragma unmanaged
在/clr
-编译文件,因此根本不应该有任何托管版本。(帮助#pragma managed
说,定义模板是否被管理是定义点,而不是实例化点。)
也许我对此有误,但我一直认为,当#include
在文件中为本地类型(在非/clr
文件中实现)生成头/clr
文件时,应该将其包装在一个unmanaged
块中以防止 ODR 问题。
一个问题(我记得在这里读过但现在找不到链接)表明解决方案是删除所有编译指示,让编译器弄清楚。但是,这样做会导致Managed Debugging Assistant 'LoaderLock' has detected a problem
启动。(调用堆栈只指向导致加载 C++/CLI DLL 的 C# 代码,这并不完全有帮助。)
这个问题表明存在关于模板实例化的编译器错误。鉴于这get_static_exception_object
是一个模板,这似乎是合理的,但我不确定如何解决它。
虽然另一个类似注册错误的函数是_t2m@???__FstrMgr@?1??GetInstance@CAtlStringMgr@ATL@@SAPAUIAtlStringMgr@2@XZ@YAXXZ@@YAXXZ
,它不是模板,所以这可能是一个红鲱鱼。
(我尝试在一个较小的示例中重现该问题,但还不能这样做。显然有一些我不知道的触发因素。)