2

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

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

4

3 回答 3

3

Windows NT 用于可执行文件的Portable Executable格式以及后来使用PE 标头中的元数据来支持 CLR 可执行文件

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

于 2013-01-30T00:09:12.940 回答
2

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

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

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

于 2013-01-30T00:30:39.910 回答
0

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

.Net 的 CLR 是 Microsoft 对 CLI公共语言基础结构的实现。Mono 是它的另一种实现。

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

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

于 2013-01-30T00:26:54.363 回答