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

本文关键字:dll mscorlib mscore 加载 是否 NET 应用程序 运行 | 更新日期: 2023-09-27 18:26:36

我正在努力澄清一些事情。

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

  2. mscorlib.dll和mscoree.dll(CLR)是而不是托管dll。这是正确的吗?

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

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

是。您将始终加载mscoree.dll,这是默认CLR主机的引导程序。它是一个非托管DLL。每个.NET程序集都包含一点点本机代码,只是跳转到DLL中。然而,它确实是由最新的Windows版本直接加载的,操作系统加载程序内置了.NET感知功能。当你打开非托管调试选项"项目+属性"的"调试"选项卡时,你可以在"调试+模块"窗口中看到它。然后你还会看到mscorjit.dll、mscorwks.dll和msvcr80.dll,这是运行托管代码所需的其他三块本机代码。分别是实时编译器、CLR和C运行时支持库。它们在.NET4中有不同的DLL名称。

从技术上讲,不加载mscorlib.dll是可能的,编译器有/nostlib选项来避免引用该程序集。实际上,只有当您提供一个替代品时,这才有效,例如Silverlight就是这样编译的。除此之外,它是一个混合模式程序集,包含一些本机代码,但大部分是托管代码。因此,64位框架有一个单独的版本。您还会看到启用了非托管调试的mscorlib.ni.dll,这是程序集的ngen-ed版本。

我建议通过C#阅读Jefrey Richter的书《CLR》。它非常清楚地解释了引擎盖下发生的事情:)

另外,你可能会发现这个问题很有帮助:为什么是程序集.exe文件?

.Net可执行文件与任何其他PE文件没有什么不同。因此,就像本机可执行文件中的每个导入的dll一样,mscorlib.dll加载在.net可执行文件的进程虚拟空间中。如果你感兴趣,你可以在这里阅读关于PE文件格式的