我对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
很不清楚,如果使用Assembly.Load(),CLR刚刚初始化。 CRT由一个称为“模块初始化程序”的不起眼的CLI功能初始化。与类初始化程序类似,但在装入程序集时自动运行。在CLR退出之前,它被AppDomain :: DomainUnload和ProcessExit的事件处理程序取消初始化。也许你应该关注你提出这个问题的原因。 – 2011-12-20 18:12:27
请参阅下面的评论与里德的部分解释。 – 2011-12-21 06:28:35