根据我的理解,.net Framework中的汇编是中间语言文件+一些元数据,清单,也许还有别的东西。
CLR将程序集转换为机器代码,可以在给定的本地计算机上执行。
这意味着在CLR处理之前,程序集不应该由程序集执行。如果是这样,那为什么它有.exe扩展名,可以在Windows机器上执行?
答案 0 :(得分:24)
由于Windows需要创建一个流程,而.exe将通过加载 mscoree 来托管CLR 。
来自CLR via C#:
Windows检查EXE后 文件的标题,以确定是否 创建一个32位进程,一个64位 进程,或WoW64进程,Windows 加载x86,x64或IA64版本 MSCorEE.dll进入进程的地址 空间。在x86版本的Windows上, MSCOREE.dll的x86版本可以 在C:\ Windows \ System32中找到 目录。在x64或IA64版本上 Windows的x86版本 MSCorEE.dll可以在。中找到 C:\ Windows \ SysWow64目录, 而64位版本(x64或 IA64)可以在 C:\ Windows \ System32目录(for 向后兼容性原因)。然后, 进程'主线程调用a MSCorEE.dll中定义的方法。 此方法初始化CLR,加载 EXE程序集,然后调用它 入口点法(主要)。在这 点,托管应用程序已启动 并且正在运行。
答案 1 :(得分:7)
我最近在.NET程序集中的CLR存根上编写了一个blog post,以及它如何适合PE文件的可执行格式。可以找到整个系列here。
基本上,.NET程序集内部是一小部分启动CLR的本机代码。但是,此代码仅用于向后兼容。在Windows XP中,OS加载程序本身知道加载CLR以获取其中包含CLI标头的可执行文件。
答案 2 :(得分:2)
.NET .exe是一种特殊的.exe,它将首先加载CLR(公共语言运行时)。然后它将通过CLR在.exe中编译IL代码。
通过.NET框架编译的.exe是一种Portable Executable。 .exe具有CLR标头和CLR数据部分。当.exe加载时,操作系统将控制CLR。 .exe中的CLR数据部分具有元数据和IL(中间语言)段。元数据段包含有关程序集的信息(例如程序集清单)。 IL段包含IL格式的程序代码。这是一种类似于Java字节码的中间格式。
答案 3 :(得分:0)
因为它仍然是EXEcutable。