C++ C++/托管代码的CLI模块初始值设定项

C++ C++/托管代码的CLI模块初始值设定项,c++,c++-cli,managed,clr-module-initializer,C++,C++ Cli,Managed,Clr Module Initializer,是否可以为c++/cli动态库运行托管初始化代码? 我有一个很大的托管类集合,它们都包装了许多不同解决方案使用的底层非托管功能。我现在需要在执行任何其他操作之前调用一些托管代码,我已经尝试了几次,但都没有成功 我最初尝试在DllMain函数中运行代码,但很快意识到不能在DllMain中调用托管代码,因为这样不安全,并且会发生LoaderLock。 然后我发现我可以像这样编写自己的模块构造函数: #pragma warning( disable : 4483 ) void __clrcall __

是否可以为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模块初始化的话。

不,模块初始化器是一个非常有用的工具,这在C++/CLI中是非常重要的。需要初始化CRT以及托管代码中可能使用的任何静态本机对象。您必须使用ref类类型初始值设定项。您没有解释为什么这对您很重要,所以获得可用答案的几率为零。为什么类的全局实例的构造函数不起作用?它必须在程序的高级入口点之前运行一段时间。您是否有其他依赖于init的全局或静态成员对象?“目前我依赖于提供在应用程序级别调用的静态初始化函数”这正是您应该做的。“但我显然不能强制这个库的所有用户在他们的应用程序中这样做”这不是你的问题。作为库供应商,您的工作是记录需求,并使有能力的程序员相对容易地实现它。解决不正确使用图书馆的问题不是你的工作。有无限多的方式可以被误用。理想情况下,如果他们这样做,就安排它在他们脸上爆炸。