2011-12-20 90 views
2

我对CLR和CRT对混合.NET程序集(即混合托管/非托管C++程序集)的初始化顺序有一些疑问。混合管理/非托管程序集加载顺序

所以如果我有一个混合模式程序集的dll文件,并且它通过Assembly.Load加载。我注意到任何静态本地对象都不会被初始化或调用,直到一些托管代码被首先调用。好。所以我认为在启动时CLR代码首先被初始化,而CRT初始化最后被调用。关机命令如何? CRT是否首先关机,CLR关机是否持续?

那么这是怎么回事?

start of program lifetime 

initilialize CLR 
...initilialize CRT 
...construct native static instances 

... program runs.... 

...shutdown CLR 
...destruct native static instances 
shutdown CLR 

end of program lifetime 

或者它是否以其他顺序?

我的问题也适用于可执行文件(即.exe)的混合模式程序集。它是类似的?

start of program lifetime 

initilialize CLR 
...initilialize CRT 
...construct native static instances 

... program runs.... 

...shutdown CLR 
...destruct native static instances 
shutdown CLR 

end of program lifetime 
+1

很不清楚,如果使用Assembly.Load(),CLR刚刚初始化。 CRT由一个称为“模块初始化程序”的不起眼的CLI功能初始化。与类初始化程序类似,但在装入程序集时自动运行。在CLR退出之前,它被AppDomain :: DomainUnload和ProcessExit的事件处理程序取消初始化。也许你应该关注你提出这个问题的原因。 – 2011-12-20 18:12:27

+0

请参阅下面的评论与里德的部分解释。 – 2011-12-21 06:28:35

回答

2

这包括在MSDN页面Initialization of Mixed Mode Assemblies

这实际上与你的想法相反。原生代码首先被初始化,然后是托管代码。您不得访问DllMain内的任何托管代码。

拆卸流程订单没有明确记录在MSDN上,也没有在C++/CLI规范中明确记录。我相信这是特定实现,并且在与附录的本地库和托管库之间的交互有关的“无证行为”部分中进行了介绍。

+0

感谢您的链接。我的问题是,当我们的应用程序关闭时,我们有原生的静态对象,正在炸毁和崩溃我们的应用程序。 – 2011-12-20 22:29:41

+0

@CJohnson我会尽力纠正他们,直接。没有理由他们应该在关机时崩溃应用程序... – 2011-12-20 23:24:06

+0

这就是......有时它们会崩溃,有时它们不会。实际上很难用一句话来形容它。但是我有很棒的小型转储(来自现场),它显示了在winmain退出后很长一段时间内发生崩溃的调用堆栈。 – 2011-12-21 06:27:16

相关问题