2

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

因此,如果我有一个混合模式的程序集 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
4

1 回答 1

2

这在 MSDN Page for Initialization of Mixed Mode Assemblies中有介绍。

这实际上与你的想法相反。本机代码首先被初始化,然后是托管代码。不允许您访问DllMain.

MSDN 上没有明确记录拆解流程顺序,C++/CLI 规范中似乎也没有明确记录。我相信这是特定于实现的,并涵盖在与附录的本机库和托管库之间的交互有关的“未记录的行为”部分中。

于 2011-12-20T17:58:30.297 回答