c# - 为二维数组生成 IL

标签 c# reflection.emit il

我想使用 System.Reflection.Emit 命名空间为二维数组构造生成 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 代码?

最佳答案

啊,好样的'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,具体取决于值)

关于c# - 为二维数组生成 IL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260750/

相关文章:

c# - 如何发出调用动态方法的代码?

.net - 查看 .NET 应用程序中所有调用的最简单方法(分析/检测)

c# - 只有多个线程之一执行特定代码路径

c# - Reflection.Emit 优于 GetValue 和 SetValue :S

c# - 将 try-catch 放入循环中,直到 try block 中的所有语句都执行完,没有任何异常,这是一种好习惯吗?

.net - 将 nNHibernate 与发出的代码一起使用

c# - 如何加载静态字段?

.net - 为什么 MethodBody.GetILAsByteArray 在不同的平台上返回不同的数组?

c# - 为什么 webmatrix 对我不起作用?

C# 模板和特殊构造函数