为2Darrays生成IL

我想使用System.Reflection.Emit命名空间为2D数组构造生成IL。

我的C#代码是

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

使用ildasm ,我意识到为上面的C#代码生成了以下IL代码。

 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代码的好教程/文档吗?

啊,好的”类型; 对,是:

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

重新指导……如果我遇到困难,我的诀窍总是“编译类似的东西,并在reflection器中查看它”。

如果你想要一些例子 ,那么dapper-dot-net和protobuf-net都会有相当数量的IL – 第一个是更多的包含,有限和可理解的; 第二个是全力以赴,无拘无束的疯狂IL。

IL的提示:

  • 在屏幕右侧的每个步骤中跟踪评论中的堆栈
  • 使用简短forms的分支等,但只有当你知道你有一个非常本地的分支时才使用它们
  • 写一些实用工具方法,即使对于加载整数这样的简单事情(实际上这很复杂,因为有12种不同的加载int-32的方法,具体取决于值)