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

时间:2012-03-03 11:08:35

标签: c#

我想澄清一些事情。

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

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

  3. 另外,有什么好的资源可以更好地了解.NET程序的执行方式?

3 个答案:

答案 0 :(得分:26)

是。您将始终加载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版本。

答案 1 :(得分:7)

我建议阅读杰弗里·里希特的书CLR via C#。它提供了非常明确的解释:幕后发生了什么:)

此外,你可能会发现这个问题很有用:Why is an assembly .exe file?

答案 2 :(得分:4)

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

的信息