我想澄清一些事情。
运行 .NET 控制台应用程序时,mscorlib.dll/mscoree.dll 是否会加载到进程的虚拟地址空间中?
mscorlib.dll 和 mscoree.dll (CLR) 是非托管 dll。对吗?
此外,有什么好的资源可以帮助您更好地了解 .NET 程序的执行方式?
最佳答案
是的。您将始终加载 mscoree.dll,这是默认 CLR 主机的 Bootstrap 。它是一个非托管 DLL。每个 .NET 程序集都包含一小部分 native 代码,只是跳转到该 DLL。然而,它确实被最近的 Windows 版本直接加载,操作系统加载器内置了 .NET 感知。当您打开非托管调试选项、Project + Properties、Debug 选项卡时,您可以在 Debug + Modules 窗口中看到它。然后您还会看到 mscorjit.dll、mscorwks.dll 和 msvcr80.dll,这是运行托管代码所需的其他三个 native 代码块。分别是即时编译器、CLR和C运行时支持库。它们在 .NET 4 中具有不同的 DLL 名称。
从技术上讲,可以不加载 mscorlib.dll,编译器有/nostdlib 选项来避免引用该程序集。实际上,只有在您提供替代品时才有效,例如,这就是 Silverlight 的编译方式。它是一个混合模式程序集,具有一些 native 代码但主要是托管代码。因此,它有一个针对 64 位框架的单独版本。您还会看到启用了非托管调试的 mscorlib.ni.dll,这是程序集的 ngen-ed 版本。
关于c# - .NET应用程序运行时是否加载了mscorlib.dll/mscoree.dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545603/