5

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

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

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

但是,这似乎覆盖了默认的模块构造函数,并且我收到了很多链接器警告,例如:

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

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

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

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

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

4

0 回答 0