【问题标题】:How do .NET EXEcutables get run?.NET 可执行文件如何运行?
【发布时间】:2013-01-13 16:52:20
【问题描述】:

我知道它的作用,但我没有找到关于它是如何执行的解释。与 Java 不同,我们不需要调用虚拟机可执行文件来运行我们的程序。

在 .NET 中只需正常运行可执行文件。它是 Windows 服务吗?它是.Net可执行文件引用的DLL吗?它与操作系统内核绑定吗?它是一种类似于杀毒软件的拦截器吗?这是什么?

【问题讨论】:

  • JIT 只是运行 CLR 程序的 VM 的一个方面。符合标准的 CLR VM 甚至可能没有 JIT。
  • 不,我怀疑这不是的副本。虽然原始问题/标签令人困惑(尤其是“JIT”内容),但其中提到了“不需要调用虚拟机”(例如java theprogram.jar)。

标签: .net architecture executable


【解决方案1】:

这取决于您拥有的 Windows 版本。但基本机制是每个 .NET 程序集都包含 5 个字节的非托管代码。对于 EXE,它是指向 c:\windows\system32\mscoree.dll 中 _CorExeMain() 的 JMP 指令。然后是初始化 CLR 和启动程序的 Main() 方法的繁重工作。

更高版本的 Windows 有一个加载器,它知道 .NET 程序集的格式并直接与 mscoree.dll 集成。需要支持非常不寻常的功能,即 32 位可执行文件可以启动 64 位进程。更多信息请关注this answer

这是 10,000 英尺的视图。 .NET 和 Java 的本质区别在于 .NET 程序集可以包含非托管代码(如 JMP)和数据(程序集清单和 IL)。 Java .class 或 .jar 文件是纯数据。

【讨论】:

    【解决方案2】:

    如果我没记错的话,早期版本的 .net 不是由 Windows 自动加载的,但是多年来,随着 Windows 的更多版本,该过程的引导现在是无缝的。

    .Net 的 CLR 是 Microsoft 对 CLI Common Language Infrastructure 的实现。 Mono 是它的另一种实现。

    从技术上讲,CLR 是作为 COM 服务器组件实现的,它在 Windows 中运行并管理 .net 程序集的执行。

    如果你真的想了解细节,你应该看看 Jeffrey Richter 的书:CLR via C#

    【讨论】:

      【解决方案3】:

      Windows NT 用于可执行文件的Portable Executable 格式,后来使用Metadata within the PE header to support CLR executables

      在安装 .NET Framework 时,Windows 知道此信息,并使用它来启动带有可执行文件的 CLR。​​

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 2010-09-24
        • 2018-12-31
        • 1970-01-01
        相关资源
        最近更新 更多