.NET应用程序运行时是否加载了mscorlib.dll / mscoree.dll

我想澄清一些事情。

  1. 运行.NET控制台应用程序时,mscorlib.dll / mscoree.dll是否会在进程的虚拟地址空间中加载?

  2. mscorlib.dll和mscoree.dll(CLR) 不是托管dll。 那是对的吗?

另外,了解.NET程序如何执行的更好资源是什么?

是。 您将始终加载mscoree.dll,这是默认CLR主机的引导程序。 它是一个非托管DLL。 每个.NET程序集都包含一些本机代码,只是跳转到该DLL。 然而它确实被最近的Windows版本直接加载,OS加载器内置了.NET感知。 打开非托管调试选项Project + Properties,Debug选项卡时,可以在Debug + Modules窗口中看到它。 然后,您还将看到mscorjit.dll,mscorwks.dll和msvcr80.dll,以及运行托管代码所需的其他三个本机代码块。 分别是即时编译器,CLR和C运行时支持库。 它们在.NET 4中具有不同的DLL名称。

从技术上讲,可能无法加载mscorlib.dll,编译器具有/ nostdlib选项以避免对该程序集的引用。 实际上,只有在提供替代品时才有效,例如Silverlight的编译方式。 它是一个带有一些本机代码但主要是托管代码的混合模式程序集。 因此,64位框架有一个单独的版本。 你还会看到启用了非托管调试的mscorlib.ni.dll,这是程序集的ngen-ed版本。

我建议通过C#阅读Jefrey Richter的书CLR 。 它提供了非常明确的解释在幕后发生了什么:)

你也可以发现这个问题很有用: 为什么是汇编.exe文件?

.Net可执行文件与任何其他PE文件没有什么不同。 因此,与本机可执行文件中的每个导入dll一样,mscorlib.dll被加载到.net可执行文件的Process虚拟空间中。 如果您感兴趣,可以在此处阅读有关PE文件格式的信息