2010-06-13 3 views
1

저는 특수 목적의 미니 컴파일러를 작성하고 있으며, 종종 작업을 수행하는 방법을 파악하기 위해 디스 어셈블 된 CIL을 봅니다. 그러나 해체 된 코드를 Reflection.Emit 호출로 변환하는 방법이 명확하지 않은 경우가 종종 있습니다. 참조 설명서가 있습니까? 아니면이 번역을하기위한 다른 정보 출처입니까?일반적으로 ilasm 구문을 Reflection.Emit 호출로 변환하는 방법은 무엇입니까?

편집 : 예, ILGenerator에 opcode를 매핑하는 것은 매우 간단합니다. 나는 지시어와 속성과 같은 다른 모든 것들을 말하고 있습니다. 예를 들어, Dictionary<TKey,TValue>과 같은 Reflection.Emit 동등 물을 작성하는 방법을 어떻게 알 수 있습니까?

.class public auto ansi serializable beforefieldinit Dictionary<TKey, TValue> 
    extends System.Object 
    implements System.Collections.Generic.IDictionary`2<!TKey, !TValue>, 
    System.Collections.Generic.ICollection`1<valuetype 
     System.Collections.Generic.KeyValuePair`2<!TKey, !TValue>>, 
    ... 
{ 
    .custom instance void System.Diagnostics.DebuggerDisplayAttribute:: 
     .ctor(string) = { string('Count = {Count}') } 

    .method public hidebysig newslot virtual final instance bool TryGetValue 
     (!TKey key, [out] !TValue& 'value') cil managed 
    { 
     .maxstack 3 
     .locals init ([0] int32 num) 
     ... 

"param"지침은 어떻습니까?

// public static void SayHello(string s = "Hello World!") 
.method public hidebysig static void SayHello([opt] string s) cil managed 
{ 
    .param [1] = "Hello World!" 
+0

OpCodes 클래스가 일대일 매핑이 아닙니까? http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.aspx –

+0

당신이하는 일에 따라 표현식 트리를 사용하는 것이 훨씬 쉽습니다. 그런 다음 표현식 트리를 CIL : http://msdn.microsoft.com/en-us/library/bb397951.aspx – porges

+0

식 트리는 주로 클래스 및 메서드의 메타 데이터를 작성하는 것이 아니라 건물 식을 주로 사용합니다. 후자를 생성하는 방법을 알고 싶기 때문에이 질문을했습니다. (아직 .NET 4를 사용하고 있지는 않지만 Expression Tree는 .NET 4에서 다소 확장되었다고 들었습니다.). – Qwertie

답변

1

, 나는 어떤 문서 ILASM 구문과 Reflection.Emit를 호출 사이의 관계를 보여주기 위해 존재하지 않는 결론 지었다.

부수적으로, Reflection.Emit보다 RunSharp을 사용하여 런타임에 코드를 만드는 것이 더 좋습니다. 시간이 있으면 Cecil의 새 버전을 알아 내려고 노력할 것입니다.

+0

+1, RunSharp에 대해 알아두면 좋음. 당신의 특급, 얼마나 성숙합니까? 그것은 전체 개체 및 .NET 용 CIL을 생성 할 수 있습니까? (버전?) 지속적인 개발이 부족한 것 같습니다. –

+0

나는 그것이 활발하게 개발되었다고 생각하지 않지만 개발자와 이야기 할 수 있었다. 필자는이 기능이 컴파일러에서 사용하기에 충분하다고 생각하지 않지만 형식, 생성자, 필드, 메서드, 이벤트, 사용자 지정 특성, 메서드 및 식을 생성 할 수 있습니다. 나는 틀린 웹 사이트 연결을 주었다는 것을 나는 생각한다; http://code.google.com/p/runsharp/ – Qwertie

+0

알아두면 좋을 것, 감사합니다. –

1

System.Collections.Generic.Dictionary <> 클래스의 IL을보고 있습니다. "Dictionary"클래스 이름은 ModuleBuilder.DefineType()에 전달한 문자열입니다.

.param 특성은 C# 버전 4 또는 VB.NET에서 기본값이있는 매개 변수에 대해 생성됩니다. MethodBuilder.DefineParameter()에서 다시 가져온 ParameterBuilder로 설정합니다. SetConstant() 메서드를 사용하십시오.

4

그 목적으로 BLToolkitEmitHelper component을 사용합니다. Reflection.Emit을 감싸면서 IL 코드와 비슷한 유창한 API를 제공합니다. 링크 된 기사에서 추출 예 : 아무도 질문에 대답하지 수 있기 때문에

EmitHelper emit = new AssemblyBuilderHelper("HelloWorld.dll") 
    .DefineType ("Hello", typeof(object), typeof(IHello)) 
    .DefineMethod(typeof(IHello).GetMethod("SayHello")) 
    .Emitter; 
emit 
    // string.Format("Hello, {0}!", toWhom) 
    // 
    .ldstr ("Hello, {0}!") 
    .ldarg_1 
    .call (typeof(string), "Format", typeof(string), typeof(object)) 

    // Console.WriteLine("Hello, World!"); 
    // 
    .call (typeof(Console), "WriteLine", typeof(string)) 
    .ret(); 

Type type = emit.Method.Type.Create(); 
관련 문제