代码之家  ›  专栏  ›  技术社区  ›  Jordão

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

  •  3
  • Jordão  · 技术社区  · 15 年前

    是否有straighforward库可用于访问.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);
    }
    

    2 回复  |  直到 15 年前
        1
  •  3
  •   Mitchel Sellers    15 年前

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

    这是你的名字 MSDN Documentation

        2
  •  1
  •   Qwertie    15 年前

    除了ildasm之外,我不知道有什么工具可以以文本形式提取反汇编。

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

    可能是内置的反射。发射的东西也可以提取CIL,但我不确定。