C# via CLR之IL中间语言初步探索
我们先写个最简单的Console App,打印出一行字符:
using System;
using System.Collections.Generic;
using System.Text;
namespace ILTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test App for IL");
}
}
}
编译成功以后,得到一个exe文件.
我们用MSIL Disassembler打开这个.net编译的扩展了的PE格式的EXE文件,得到Metedata和IL.
ILTest.Program在ILDASM反编译出来有三个方法,本别是
//方法一:
.class private auto ansi beforefieldinit ILTest.Program
extends [mscorlib]System.Object
{
} // end of class ILTest.Program
//方法二:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Program::.ctor
//方法三:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Test App for IL"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::Main
除此之外,在这个PE32文件中还包含一个"清单(MainFest)"的数据块.清单是由元数据表构成的另外一种集合.这些表描述了构成程序集的文件.由程序集中的文件实现的公共导出的类型,以及和这些程序集关联在一起的一些资源或者是数据文件.
同时,在Debug文件夹下面还生成了一个与项目文件同名的 <项目文件名>.vshost.exe文件.这个文件是一个提高调试性能的宿主进程,,支持部分信任调试并支持设计时表达式计算。
另外,还包含了一个同名的pdb文件,程序数据库文件,保存着调试和项目的状态信息的一个文件.从而可以对调试配置进行增量链接.当用 /ZI 或 /Zi 编译 C/C++ 程序时或用 /debug 编译 Visual Basic/C# 程序时将创建 PDB 文件.对于本机代码,它驻留在 \debug 子目录中。而对于托管代码,它驻留在 \WINDEBUG 子目录中。
using System;
using System.Collections.Generic;
using System.Text;
namespace ILTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test App for IL");
}
}
}
编译成功以后,得到一个exe文件.
我们用MSIL Disassembler打开这个.net编译的扩展了的PE格式的EXE文件,得到Metedata和IL.
ILTest.Program在ILDASM反编译出来有三个方法,本别是
//方法一:
.class private auto ansi beforefieldinit ILTest.Program
extends [mscorlib]System.Object
{
} // end of class ILTest.Program
//方法二:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Program::.ctor
//方法三:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Test App for IL"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::Main
除此之外,在这个PE32文件中还包含一个"清单(MainFest)"的数据块.清单是由元数据表构成的另外一种集合.这些表描述了构成程序集的文件.由程序集中的文件实现的公共导出的类型,以及和这些程序集关联在一起的一些资源或者是数据文件.
同时,在Debug文件夹下面还生成了一个与项目文件同名的 <项目文件名>.vshost.exe文件.这个文件是一个提高调试性能的宿主进程,,支持部分信任调试并支持设计时表达式计算。
另外,还包含了一个同名的pdb文件,程序数据库文件,保存着调试和项目的状态信息的一个文件.从而可以对调试配置进行增量链接.当用 /ZI 或 /Zi 编译 C/C++ 程序时或用 /debug 编译 Visual Basic/C# 程序时将创建 PDB 文件.对于本机代码,它驻留在 \debug 子目录中。而对于托管代码,它驻留在 \WINDEBUG 子目录中。
posted on 2007-10-13 22:52 lbq1221119 阅读(1049) 评论(3) 编辑 收藏 举报