2010-05-05 63 views
3

是否有一个直观的库,可以用来访问.NET类型的CIL?让我证明什么,我想虚拟CilExtractor做:以编程方式访问.NET类型的CIL

[Serializable] 
public class Type_For_Extract_Cil_Test { 

    private int _field = 3; 

    public int Method(int value) { 
    checked { 
     return _field + value; 
    } 
    } 

} 

[Test] 
public void Extract_Cil_For_Type_Test() { 
    string actualCil = CilExtractor.ExtractCil(typeof(Type_For_Extract_Cil_Test)); 
    string expectedCil = @" 
    .class public auto ansi serializable beforefieldinit Type_For_Extract_Cil_Test 
     extends [mscorlib]System.Object 
    { 
     .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
     { 
     .maxstack 8 
     ldarg.0 
     ldc.i4.3 
     stfld int32 Type_For_Extract_Cil_Test::_field 
     ldarg.0 
     call instance void [mscorlib]System.Object::.ctor() 
     ret 
     } 

     .method public hidebysig instance int32 Method(int32 'value') cil managed 
     { 
     .maxstack 8 
     ldarg.0 
     ldfld int32 Type_For_Extract_Cil_Test::_field 
     ldarg.1 
     add.ovf 
     ret 
     } 

     .field private int32 _field 
    }"; 
    // indentations and code formatting issues apart, this should succeed 
    Assert.AreEqual(expectedCil, actualCil); 
} 

我知道我可以Mono.Cecil能或反思这样做,但我也知道我必须写很多代码来实现这一目标。由于Reflector已经在它的用户界面上做了这个,是不是有一种简单的方法来访问这个功能,就像使用一个简单的方法调用一样?是否还有其他库更适合这种特定场景?

回答

3

那么.NET框架提供了ildasm.exe工具,它可以在命令行环境中用来进行反汇编,它可能是一个很好的开始。

这里是关于命令行选项的MSDN Documentation

+0

在反射器占主导的时代,我完全忘了ildasm。谢谢你提醒我! – 2010-05-05 15:54:29

1

我不知道除了ildasm之外的文本提取反汇编工具。

我认为Mono.Cecil能够检索关于程序集及其类型的所有元数据,包括CIL代码。程序集由对象集合表示,但不以文本形式表示。

可能内置Reflection.Emit的东西也可以提取CIL,但我不确定。