Программный доступ к CIL для типа .NET - PullRequest
3 голосов
/ 05 мая 2010

Есть ли простая библиотека, которую я могу использовать для доступа к CIL для типа .NET? Позвольте мне продемонстрировать, что я хочу, чтобы фиктивная 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 уже делает это в своем пользовательском интерфейсе, разве нет простого способа получить доступ к этой функциональности, как с помощью простого вызова метода? Существуют ли другие библиотеки, которые лучше подходят для этого конкретного сценария?

Ответы [ 2 ]

3 голосов
/ 05 мая 2010

Ну, есть инструмент ildasm.exe, предоставляемый .NET Framework, и его можно использовать в среде командной строки для выполнения разборки, он может быть хорошим местом для запуска.

Вот документация MSDN в параметрах командной строки.

1 голос
/ 07 мая 2010

Я не знаю инструмента для извлечения разборки в текстовом виде, кроме ildasm.

Я думаю, Mono.Cecil может получить все метаданные о сборке и ее типах, включая код CIL. Сборка представлена ​​коллекцией объектов, но не в текстовой форме.

Вероятно, встроенный компонент Reflection.Emit может также извлечь CIL, но я не уверен.

...