托管代码的C ++ / CLI模块初始化程序

时间:2016-07-05 11:36:41

标签: c++ c++-cli managed clr-module-initializer

是否可以为c ++ / cli动态库运行托管初始化代码? 我有一大堆托管类,它们都包含了许多不同解决方案所使用的底层非托管功能。我现在需要在执行任何其他操作之前调用一些托管代码,并且我已尝试了多次尝试但尚未成功。

我最初尝试在DllMain函数中运行代码,但很快意识到你不能在DllMain中调用托管代码,因为它不安全并且发生了LoaderLock。 然后我发现我可以像这样编写自己的Module Constructor:

#pragma warning( disable : 4483 )
void __clrcall __identifier(".cctor")()
{
    // Do managed code initialisation here
}

但是,这似乎覆盖了默认的Module Constructor,我收到了很多链接器警告,如:

warning LNK4210: .CRTMP section exists; there may be unhandled static initializers or terminators

一些研究表明,默认模块构造函数_DllMainCRTStartup调用_CRT_INIT,它初始化C / C ++静态对象。普遍的共识似乎是覆盖dll的入口点是一个非常糟糕的主意,我不想为自己造成更多问题。

我尝试的最后一件事是在全局范围内创建托管初始化程序类的全局静态对象,希望它可以在_CRT_INIT中初始化,但似乎并非如此。

是否有任何方法可以将某些托管代码作为模块初始化执行,甚至可以执行仍然保证在模块中的其他任何内容之前调用的延迟代码?

谢谢,目前我依赖于提供在应用程序级别调用的静态初始化函数,但我显然无法强制此库的所有用户在其应用程序中执行此操作。 我看到的另一个选项是在所有托管类构造函数中添加初始化调用,但同样,我不能确定构建在这个库上的任何人都将遵循相同的设计模式,并且它似乎需要维护很多,特别是如果有的话是一种简单的CLR模块初始化方法。

0 个答案:

没有答案