我对混合 .NET 程序集(即混合托管/非托管 C++ 程序集)的 CLR 和 CRT 的初始化顺序有一些疑问。
因此,如果我有一个混合模式程序集 dll 文件,它会通过 Assembly.Load 加载。我注意到在首先调用某些托管代码之前,任何静态 native 对象都不会被初始化或调用。好的。所以我认为在启动时首先初始化 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
最佳答案
Initialization of Mixed Mode Assemblies 的 MSDN 页面中对此进行了介绍.
其实和你的想法正好相反。 native 代码首先 被初始化,然后是托管代码。不允许您访问 DllMain
中的任何托管代码。
拆卸过程顺序未在 MSDN 上明确记录,并且似乎未在 C++/CLI 规范中明确记录。我相信这是特定于实现的,并且涵盖在与附录的 native 库和托管库之间的交互相关的“未记录的行为”部分中。
关于.net - 混合托管/非托管程序集加载顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579747/