我想使用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代码?
答案 0 :(得分:8)
啊,好吧'typeof
;是的,那就是:
il.Emit(OpCodes.Ldtoken, typeof(int));
il.EmitCall(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"), null);
重新指导......如果我遇到困难,我的诀窍总是“编译类似的东西,并在反射器中查看它。”
如果你想要一些例子,dapper-dot-net和protobuf-net都会有相当数量的IL - 第一个更容易包含,有限且易于理解;第二个是全力以赴,无拘无束的疯狂IL。
IL的提示: