ILDASM的使用
写在前面:微软中间语言(MSIL)是一种语言,所有.NET的语言如C#,VB.NET都会被编译成为IL语言。ILDASM是.NET环境自带的反编译工具,可以查看到dll或exe生成的源代码。而因为IL是一种语言,按IL的语法可以反向生成dll,如果您想修改.NET自带的dll的源代码,这是一个方法。
ILDASM举例
来自互联网的例子
private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
i = i++;
MessageBox.Show(i.ToString());
}
{
int i = 0;
i = i++;
MessageBox.Show(i.ToString());
}
在开始-所有程序-Microsoft .NET Framework SDK v2.0-Tools-MSIL反汇编程序中,可以找到ILDASM工具,如果您已经删除了这个快捷方式,可以在开始-所有程序-Microsoft Visual Studio 2005-Visual Studio Tools-Visual Studio2005命令提示,然后键入ildasm,就可以显示这个工具,如果连这个快捷方式都删除了,就只能直接从安装目录中搜索这个文件了。生成的IL代码是
.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// 代码大小 22 (0x16)
.maxstack 3
.locals init ([0] int32 i)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: dup
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: stloc.0
IL_0008: ldloca.s i
IL_000a: call instance string [mscorlib]System.Int32::ToString()
IL_000f: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
IL_0014: pop
IL_0015: ret
} // end of method Form1::Form1_Load
class [mscorlib]System.EventArgs e) cil managed
{
// 代码大小 22 (0x16)
.maxstack 3
.locals init ([0] int32 i)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: dup
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: stloc.0
IL_0008: ldloca.s i
IL_000a: call instance string [mscorlib]System.Int32::ToString()
IL_000f: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
IL_0014: pop
IL_0015: ret
} // end of method Form1::Form1_Load
生成IL代码,可以在一定程序上帮助我们理解代码执行的内容。
使用ILDASM和其它工具修改.NET自带的dll
您可以在网上搜索这个文章
微软MVP手把手教你如何修改.NET Framework
笔者正是从这个网址了解相关信息http://bbs.bbsgood.com/post_6_151902_1.html
原理
系统自带的dll被调用之后,会在临时的目录中生成il代码,使用FileMon这个工具可以找到这一特定的dll。找到目录后,使用ildasm反编译dll,生成il文件,再使用Reflector工具找到自己要修改的代码,在了解IL语言的前提下,修改相关的IL代码。最后编译为dll,放到相应的目录。
不过这个过程实在是太辛苦,又会导致系统默认的dll版本不统一。一般情况下不要使用。