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
时它应该包含在Managed Debugging Assistant 'LoaderLock' has detected a problem
块中,以防止出现ODR问题。
一个问题(我记得在这里阅读但现在找不到链接)表明解决方案是删除所有编译指示并让编译器弄明白。但是,这样做会导致get_static_exception_object
启动时。 (调用堆栈只指向导致加载C ++ / CLI DLL的C#代码,这并不完全有用。)
This question表明存在关于模板实例化的编译器错误。鉴于_t2m@???__FstrMgr@?1??GetInstance@CAtlStringMgr@ATL@@SAPAUIAtlStringMgr@2@XZ@YAXXZ@@YAXXZ
是一个模板,这似乎是合理的,但我不知道如何解决它。
虽然另一个类似注册不正确的功能是;WITH Table1 AS (
SELECT * FROM (VALUES
(1, 1, '2009-05-25', 1),
(1, 2, '2009-05-25', 1),
(1, 1, '2010-02-04', 0),
(1, 3, '2010-02-04', 1),
(1, 1, '2009-04-01', 0),
(1, 1, '2009-03-01', 1))
AS t(ID, FID, ModifyDate, IsActive)
)
SELECT DISTINCT ID,
ModifyDate,
STUFF(( SELECT DISTINCT ',' + CAST(FID AS VARCHAR)
FROM Table1 t
WHERE t.ModifyDate = a.ModifyDate
FOR XML PATH('')),1,1,'') colb
FROM Table1 a
WHERE IsActive=1
,不一个模板,所以这可能是一个红色的鲱鱼。
(我试过在一个较小的例子中再现问题,但还没有能够这样做。显然有一些我不知道的触发器。)