Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单生成的MSIL抛出;操作可能会破坏运行时的稳定性;_C#_.net_Cil_Dynamicmethod - Fatal编程技术网

C# 简单生成的MSIL抛出;操作可能会破坏运行时的稳定性;

C# 简单生成的MSIL抛出;操作可能会破坏运行时的稳定性;,c#,.net,cil,dynamicmethod,C#,.net,Cil,Dynamicmethod,我创建了一个非常简单的函数,它执行以下操作: public static object[] ToArray(int ID) { return new object[4]; } 这是生成MSIL的代码。为什么会抛出“操作可能破坏运行时稳定”异常?我看不出它有什么毛病;它与Reflector/Reflexil中的组件完美匹配 // create method Type arrayType = typeof(object[]); Type in

我创建了一个非常简单的函数,它执行以下操作:

    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 });
    // 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 });

或者,完全摆脱stloc/ldloc——你不需要它。你甚至不需要
DeclareLocal
,因为你不再使用它了。