托管c dll的加载程序锁定错误,静态链接到本机c lib
我有一个托管c dll,其中几个托管类反过来调用我已静态链接到dll的库中的本机c代码.但是,如果我尝试在dll上运行RegAsm.exe,该工具会正确报告“我们没有注册的类型”,但随后会挂起.我很确定这是一个
loader lock问题,当RegAsm尝试加载它时我的dll会挂起.我正在使用Visual Studio 2008,快递版.
让我感到困惑的是,在将本机代码放入dll时,一切正常,但在从库中静态链接时却没有.我知道这篇文章与this question类似,但我的dll中没有DllMain,我没有从DllMain运行MSIL代码的风险.另外,遵循在单个文件上设置/ clr的建议没有帮助. 使用/ NOENTRY编译dll会修复锁定问题,但会导致应用程序因类型初始值设定项而断开< Module>抛出异常异常,显然只是推荐使用.NET 2003. 我怀疑静态成员的初始化可能是一个可能的罪魁祸首,但为什么在我的静态库中编译成MSIL会超出我的范围.
解决了这个问题,但很少有事情不清楚,我很好奇: 我注意到,当事情停止工作时,静态链接库中的头文件中添加了两个静态变量,如下所示: // The whole header is forced to compile as native #pragma managed(push,off) .... static const std::locale commaSeparator(std::locale::classic(),new DecimalSeparator<char>(','));; .... #pragma managed(pop) 将初始化移动到.cpp文件(并将static更改为extern)可修复加载程序锁定.任何人都可以指出为什么初始化程序会被编译为MSIL? 在修复之前,如果我只是#included来自托管dll的头文件,那么一切正常.但是,如果我包含标题AND也链接到lib,事情就不起作用了.由于lib也在内部使用头,我最终得到了静态变量的两个实例吗?在任何情况下,为什么投诉运行MSIL代码? 虽然事情现在有效,但任何见解都会受到欢迎. 解决方法
Compiiler包装用自己的代码,这是用来初始化运行时库和全局变量(让用户自定义的DllMain可以与已经创建全局对象运行,并可以使用标准库),用户自定义的DllMain.即使你没有DllMain,仍然会有编译器生成的.使用/ NOENTRY指示链接器忽略它.
因此,在静态变量的构造函数中执行某些操作实际上与在DllMain中执行此操作相同,并且似乎就是这种情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |