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 子目录中。

posted on 2007-10-13 22:52  lbq1221119  阅读(1049)  评论(3编辑  收藏  举报

导航