C ++ / CLI程序集

时间:2016-03-01 07:27:17

标签: .net dll c++-cli loaderlock

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

(我试过在一个较小的例子中再现问题,但还没有能够这样做。显然有一些我不知道的触发器。)

0 个答案:

没有答案