C# via CLR之IL中間語(yǔ)言初步探索
我們先寫(xiě)個(gè)最簡(jiǎn)單的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");
}
}
}
編譯成功以后,得到一個(gè)exe文件.
我們用MSIL Disassembler打開(kāi)這個(gè).net編譯的擴(kuò)展了的PE格式的EXE文件,得到Metedata和IL.
ILTest.Program在ILDASM反編譯出來(lái)有三個(gè)方法,本別是
//方法一:
.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
除此之外,在這個(gè)PE32文件中還包含一個(gè)"清單(MainFest)"的數(shù)據(jù)塊.清單是由元數(shù)據(jù)表構(gòu)成的另外一種集合.這些表描述了構(gòu)成程序集的文件.由程序集中的文件實(shí)現(xiàn)的公共導(dǎo)出的類(lèi)型,以及和這些程序集關(guān)聯(lián)在一起的一些資源或者是數(shù)據(jù)文件.
同時(shí),在Debug文件夾下面還生成了一個(gè)與項(xiàng)目文件同名的 <項(xiàng)目文件名>.vshost.exe文件.這個(gè)文件是一個(gè)提高調(diào)試性能的宿主進(jìn)程,,支持部分信任調(diào)試并支持設(shè)計(jì)時(shí)表達(dá)式計(jì)算。
另外,還包含了一個(gè)同名的pdb文件,程序數(shù)據(jù)庫(kù)文件,保存著調(diào)試和項(xiàng)目的狀態(tài)信息的一個(gè)文件.從而可以對(duì)調(diào)試配置進(jìn)行增量鏈接.當(dāng)用 /ZI 或 /Zi 編譯 C/C++ 程序時(shí)或用 /debug 編譯 Visual Basic/C# 程序時(shí)將創(chuàng)建 PDB 文件.對(duì)于本機(jī)代碼,它駐留在 \debug 子目錄中。而對(duì)于托管代碼,它駐留在 \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");
}
}
}
編譯成功以后,得到一個(gè)exe文件.
我們用MSIL Disassembler打開(kāi)這個(gè).net編譯的擴(kuò)展了的PE格式的EXE文件,得到Metedata和IL.
ILTest.Program在ILDASM反編譯出來(lái)有三個(gè)方法,本別是
//方法一:
.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
除此之外,在這個(gè)PE32文件中還包含一個(gè)"清單(MainFest)"的數(shù)據(jù)塊.清單是由元數(shù)據(jù)表構(gòu)成的另外一種集合.這些表描述了構(gòu)成程序集的文件.由程序集中的文件實(shí)現(xiàn)的公共導(dǎo)出的類(lèi)型,以及和這些程序集關(guān)聯(lián)在一起的一些資源或者是數(shù)據(jù)文件.
同時(shí),在Debug文件夾下面還生成了一個(gè)與項(xiàng)目文件同名的 <項(xiàng)目文件名>.vshost.exe文件.這個(gè)文件是一個(gè)提高調(diào)試性能的宿主進(jìn)程,,支持部分信任調(diào)試并支持設(shè)計(jì)時(shí)表達(dá)式計(jì)算。
另外,還包含了一個(gè)同名的pdb文件,程序數(shù)據(jù)庫(kù)文件,保存著調(diào)試和項(xiàng)目的狀態(tài)信息的一個(gè)文件.從而可以對(duì)調(diào)試配置進(jìn)行增量鏈接.當(dāng)用 /ZI 或 /Zi 編譯 C/C++ 程序時(shí)或用 /debug 編譯 Visual Basic/C# 程序時(shí)將創(chuàng)建 PDB 文件.對(duì)于本機(jī)代碼,它駐留在 \debug 子目錄中。而對(duì)于托管代碼,它駐留在 \WINDEBUG 子目錄中。
posted on 2007-10-13 22:52 lbq1221119 閱讀(1058) 評(píng)論(3) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)