以编程方式访问CIL以获取.NET类型

时间:2010-05-05 15:44:23

标签: .net reflection cil

是否有一个可以用来访问.NET类型的CIL的直接库?让我演示一下我想要的虚构CilExtractor

[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做到这一点,但我也知道我必须编写很多代码来实现这一点。由于Reflector已经在其UI上执行此操作,是否有一种简单的方法来访问此功能,例如使用简单的方法调用?是否有其他库更适合这种特定情况?

2 个答案:

答案 0 :(得分:3)

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

以下是命令行选项中的MSDN Documentation

答案 1 :(得分:1)

除了ildasm之外,我不知道用于以文本形式提取反汇编的工具。

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

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