0

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,它不是模板,所以这可能是一个红鲱鱼。

(我尝试在一个较小的示例中重现该问题,但还不能这样做。显然有一些我不知道的触发因素。)

4

0 回答 0