2010-05-05 3 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는 이미 UI에서이 작업을 수행하므로 간단한 메소드 호출과 같이이 기능에 액세스하는 간단한 방법이 없습니까? 이 특정 시나리오에 더 적합한 다른 라이브러리가 있습니까?

답변

3

.NET Framework에서 제공하는 ildasm.exe 도구가 있으며 명령 줄 환경에서 디스 어셈블리를 수행하는 데 사용할 수 있으므로 시작하기에 좋습니다.

여기에 명령 줄 옵션에 MSDN Documentation이 있습니다.

+0

리플렉터 지배 시대에 나는 ildasm을 완전히 잊었습니다. 나를 상기시켜 줘서 고마워! –

1

ildasm 이외의 텍스트 형식으로 디스 어셈블리를 추출하는 도구에 대해 모르겠습니다.

나는 Mono.Cecil이 CIL 코드를 포함하여 어셈블리와 그 유형에 관한 모든 메타 데이터를 검색 할 수 있다고 생각합니다. 어셈블리는 텍스트 형식이 아닌 개체 모음으로 표현됩니다.

아마 내장 된 Reflection.Emit 물건도 CIL을 추출 할 수 있지만 확실하지 않습니다.