.net - 混合托管/非托管程序集加载顺序

标签 .net windows msvcrt mixed-mode

我对混合 .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/

相关文章:

c# - 如何在 .NET 3.5+ 中获取用户的 "flat"域名

c - 如何用C读取主文件表(MFT)?

windows - ffmpeg 和 ffprobe 嵌套延迟扩展变量

windows - Windows 操作系统中的驱动程序堆栈是什么?

c++ - 在未定义 _DEBUG 时检查堆完整性?

.net - 连接到 SQL Server 2008 R2 Express 时出错

.net - 在不添加命名空间保留的情况下使用 System.Net.HttpListener 需要什么权限?

c# - 是否可以从 Visual Studio 中复制代码并将格式化的代码粘贴到 OneNote 中?

python - Cython:缺少 MSVCR140.dll

c++ - 由于已经定义而导致的链接器错误