【发布时间】:2012-03-21 16:23:03
【问题描述】:
我正试图澄清一些事情。
运行 .NET 控制台应用程序时,mscorlib.dll/mscoree.dll 是否会加载到进程的虚拟地址空间中?
mscorlib.dll 和 mscoree.dll (CLR) 是非托管 dll。对吗?
另外,了解更多关于如何执行 .NET 程序的好资源是什么?
【问题讨论】:
标签: c#
我正试图澄清一些事情。
运行 .NET 控制台应用程序时,mscorlib.dll/mscoree.dll 是否会加载到进程的虚拟地址空间中?
mscorlib.dll 和 mscoree.dll (CLR) 是非托管 dll。对吗?
另外,了解更多关于如何执行 .NET 程序的好资源是什么?
【问题讨论】:
标签: c#
是的。您将始终加载 mscoree.dll,这是默认 CLR 主机的引导程序。它是一个非托管 DLL。每个 .NET 程序集都包含少量本机代码,只需跳转到该 DLL。然而,它确实会被最近的 Windows 版本直接加载,操作系统加载程序具有内置的 .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 版。
【讨论】:
我建议阅读 Jefrey Richter 的书 CLR via C#。它提供了非常清晰的解释:)
你也可能会觉得这个问题很有帮助:Why is an assembly .exe file?
【讨论】:
.Net Executable 与任何其他 PE 文件没有什么不同。因此,与本机可执行文件中的每个导入 dll 一样,mscorlib.dll 被加载到 .net 可执行文件的进程虚拟空间中。 如果你感兴趣,可以阅读PE文件格式here
【讨论】: