2011-06-07 128 views
4

我想使用System.Reflection.Emit命名空間爲2D陣列構造生成IL。爲2D陣列生成IL

我的C#代碼是

Array 2dArr = Array.CreateInstance(typeof(int),100,100); 

使用ildasm,我意識到,以下IL代碼是上述 C#代碼生成的。

IL_0006: call  class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) 
IL_000b: ldc.i4.s 100 
IL_000d: ldc.i4.s 100 
IL_000f: call  class [mscorlib]System.Array [mscorlib]System.Array::CreateInstance(class [mscorlib]System.Type, 
                          int32, 
                          int32) 

我能夠生成最後三條IL語句,如下所示。

MethodInfo createArray = typeof(Array).GetMethod("CreateInstance", 
       new Type[] { typeof(Type),typeof(int),typeof(int) }); 
gen.Emit(OpCodes.Ldc_I4_1); 
      gen.Emit(OpCodes.Ldc_I4_1); 
      gen.Emit(OpCodes.Call, createArray); 

但我沒有關於如何生成拳頭IL語句清晰的概念(即IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) )

你有什麼想法?

此外,有人可以指出一些關於如何使用System.Reflection.Emit命名空間以生成IL代碼的好教程/文檔?

回答

8

啊,好ol'typeof;是的,那就是:

il.Emit(OpCodes.Ldtoken, typeof(int)); 
il.EmitCall(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"), null); 

重新引導......我的絕招,如果我遇到問題總是「編譯類似的東西,看看它在反射器」。

如果你想要一些例子dapper-dot-netprotobuf-net都做IL,像樣的數目 - 第一個是多個內含,有限的和可以理解的;第二個是全力以赴的,沒有任何禁止的瘋狂的IL。

的提示IL:

  • 在屏幕
  • 用樹枝等的短期形式的右手邊的每一步跟蹤意見堆,但只有當你知道你使用它們有一個非常本地的分支
  • 爲自己寫一些實用方法,即使對於加載一個整數這樣的簡單事情來說(這實際上相當複雜,因爲有12種不同的加載int-32的方式,取決於值)
+0

非常感謝,這真的幫助我 – 2011-06-07 18:12:05