网站地图
hnsjyk999.com
三九百科 包罗万象
hello.exe 发布于:

hello.exe,一旦安装了 .NET,您就可以使用记事本或 Visual Studio 创建包含前面的“Hello World”程序之一的文件。创建一个空的子目录,将文件保存到该子目录当中,并命名为 hello.cs(CS 表示为 C# 文件)。

打开命令提示并更改到正在使用的目录。键入“csc hello.cs”命令来编译该程序。如果在目录中查看,您将发现已经创建了 hello.exe 文件。键入“hello”执行该文件,控制台窗口将显示“Hello, World!”。

可执行文件的内容,列出目录的内容,请注意只有两个文件:hello.cs 和 hello.exe。Hello.exe 是一个非常小的文件,只有 3 KB 左右。真简单。

但是,hello.exe 文件中有些什么?这就不那么简单了。有一个存根加载器,即很小的本机机器语言程序,它可加载 .NET Runtime 并给予其控制权以便使它开始执行您的程序。

但是两个重要的部分是元数据和 IL 中的代码,元数据向 Common Language Runtime 和可能引用程序中的类型的编译器解释该程序。(您可能会想起 IL 是 .NET Runtime 的机器语言。)当 Runtime 即将开始执行每种方法时,它将 IL 转换为本机代码,然后执行本机代码。.NET 从来不解释 IL,它总是将 LI 编译成本机代码。

如何查看元数据和 IL?使用 IL 反汇编 (ILDASM) 工具会使该操作变得非常简单。只要在命令提示下输入图 “ILDASM hello.exe”(假设 hello.exe 文件在当前目录下)就可以了。您可以看到一个如下显示的窗口。

1:ILDASM 窗口

最初,“hello.exe”之下的目录树显示两个部分:清单和类 MyApp。由于模块 hello.exe 有一个清单,所以我们知道它就是程序集的说明文件。在这种情况下,程序集仅包含一个模块文件 hello.exe。

清单

双击清单将看到元数据的一小部分,这部分说明了这个程序集(应用程序或组件)中包含的模块(文件)。对于第三个 hello.exe 程序,它看起来如下:

.assembly extern mscorlib {

.originator = (03 68 91 16 D3 A4 AE 33 )

.hash = (52 44 F8 C9 55 1F 54 3F 97 D7 AB AD E2 DF 1D E0

F2 9D 4F BC )

.ver 1:0:2204:21

}

.assembly hello as "hello" {

// --- 下面的自定义属性是自动添加的

// 不要取消注释 -------

// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,

bool) = ( 01 00 00 01 00 00 )

.hash algorithm 0x00008004

.ver 0:0:0:0

}

.module hello.exe

// MVID: {59365AA0-B469-4359-9BAF-4840A9257C61}

这个元数据声明程序集 hello 的版本为 0.0.0.0,包含模块 hello.exe,并且使用 1.0.2204.21 版本的 mscorlib 程序集(.NET Runtime 主 DLL)。模块版本标识符 (MVID) 是一个包含此版本模块 hello.exe 的 ID 的全局唯一标识符 (GUID)。


相关文章推荐:
编译器 | 机器语言 | 反汇编 | 当前目录 | 程序集 | 程序集 | 程序集 | 自定义属性 | 程序集 |