2010-05-05 3 views
3

Есть ли библиотека straighforward, которую я могу использовать для доступа к CIL для .NET-типа? Позвольте мне показать, что я хочу фиктивный CilExtractor сделать:Программный доступ к CIL для .NET-типа

[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

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

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

+0

В эпоху доминирующего рефлектора я полностью забыл о ildasm. Спасибо за напоминание! –

1

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

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

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