我创建了一个非常简单的函数来执行以下操作:
public static object[] ToArray(int ID) {
return new object[4];
}
这是生成 MSIL 的代码。为什么这会抛出“操作可能会破坏运行时的稳定性”异常?我看不出有什么问题;它与 Reflector/Reflexil 中看到的组件完美匹配。
// create method
Type arrayType = typeof(object[]);
Type intType = typeof(int);
DynamicMethod dm = new DynamicMethod(methodName, arrayType, new Type[] { intType });
ILGenerator il = dm.GetILGenerator();
// create the array -- object[]
il.Emit(OpCodes.Ldc_I4, 4);
il.Emit(OpCodes.Newarr, typeof(object));
il.Emit(OpCodes.Stloc_0);
// return the array
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);
return dm;
object result = dm.Invoke(null, new object[] { 1 });
最佳答案
我发现新变量没有正确声明。
您需要使用 DeclareLocal(typeof(T))
语法来声明一个新的局部变量。
更新后的代码片段如下:
// create method
Type arrayType = typeof(object[]);
Type intType = typeof(int);
DynamicMethod dm = new DynamicMethod(methodName, arrayType, new Type[] { intType });
ILGenerator il = dm.GetILGenerator();
// create the array -- object[]
LocalBuilder arr = il.DeclareLocal(arrayType);
il.Emit(OpCodes.Ldc_I4, 4);
il.Emit(OpCodes.Newarr, typeof(object));
il.Emit(OpCodes.Stloc, arr); // <-- don't use direct addresses, use refs to LocalBuilder instead
// return the array
il.Emit(OpCodes.Ldloc, arr); // <-- don't use direct addresses, use refs to LocalBuilder instead
il.Emit(OpCodes.Ret);
return dm;
object result = dm.Invoke(null, new object[] { 1 });
编辑:感谢Jon Skeet,最终优化后的代码片段如下:
// create method
Type arrayType = typeof(object[]);
Type intType = typeof(int);
DynamicMethod dm = new DynamicMethod(methodName, arrayType, new Type[] { intType });
ILGenerator il = dm.GetILGenerator();
// create the array -- object[]
LocalBuilder arr = il.DeclareLocal(arrayType);
il.Emit(OpCodes.Ldc_I4, 4);
il.Emit(OpCodes.Newarr, typeof(object));
// return the array
il.Emit(OpCodes.Ret);
return dm;
object result = dm.Invoke(null, new object[] { 1 });
关于c# - 简单生成的 MSIL 抛出 "Operation could destabilize the runtime",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041803/