混合托管/非托管装配加载顺序

时间:2011-12-20 17:54:55

标签: .net windows msvcrt mixed-mode

我对CLR的初始化顺序和混合.NET程序集的CRT(即混合的托管/非托管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 个答案:

答案 0 :(得分:2)

Initialization of Mixed Mode Assemblies

的MSDN页面对此进行了介绍

这实际上与你的想法相反。本机代码首先初始化,然后是托管代码。您无权访问DllMain内的任何托管代码。

拆除流程订单未在MSDN上明确记录,并且似乎未在C ++ / CLI规范中明确记录。我认为这是特定于实现的,并且涉及与附录的本机库和托管库之间的交互相关的“未记录的行为”部分。