Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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# JIT或CLR中可能存在的错误_C#_.net_Clr_Jit_Reflection.emit - Fatal编程技术网

C# JIT或CLR中可能存在的错误

C# JIT或CLR中可能存在的错误,c#,.net,clr,jit,reflection.emit,C#,.net,Clr,Jit,Reflection.emit,我的代码生成了一个方法,假设维度长度数组,动态创建多维数组,但是JIT编译器甚至CLR似乎无法正确地从维度长度数组加载项 不再创建int[10,10,10]数组,而是创建int[10,10,0]数组。在OpCodes.Ldelem\u I中似乎出现了错误,但是,使用OpCodes.Ldelem时,typeof(int)只会起作用。复制此行为时,需要任何CPU设置,x86工作正常。此问题在调试模式和发布模式下都会发生 这是一个bug吗?我觉得无法判断这一点,因为我无法深入了解这一点 class P

我的代码生成了一个方法,假设维度长度数组,动态创建多维数组,但是JIT编译器甚至CLR似乎无法正确地从维度长度数组加载项

不再创建
int[10,10,10]
数组,而是创建
int[10,10,0]
数组。在
OpCodes.Ldelem\u I
中似乎出现了错误,但是,使用
OpCodes.Ldelem时,typeof(int)
只会起作用。复制此行为时,需要任何CPU设置,x86工作正常。此问题在调试模式和发布模式下都会发生

这是一个bug吗?我觉得无法判断这一点,因为我无法深入了解这一点

class Program
{
    static void Main(string[] args)
    {
        CreateMultidimensionalArrayCreator(typeof(int[, ,])).Invoke(new int[] { 10, 10, 10 }); ;            
    }

    static Func<int[], Array> CreateMultidimensionalArrayCreator(Type type)
    {
        int rank = type.GetArrayRank();

        DynamicMethod method = new DynamicMethod(String.Empty, typeof(Array), new Type[] { typeof(int[]) }, typeof(Program), false);
        ILGenerator ilGen = method.GetILGenerator();

        for (int i = 0; i < rank; i++)
        {
            // Load element from dimension lengths array
            ilGen.Emit(OpCodes.Ldarg_0);
            ilGen.Emit(OpCodes.Ldc_I4, i);
            ilGen.Emit(OpCodes.Ldelem_I); // Somehow returns 0 for last element, however, OpCodes.Ldelem appears to work fine
            // Duplicate element and write to console for diagnostics
            ilGen.Emit(OpCodes.Dup);
            ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int) }));
        }

        // Get parameters for multidimensional array constructor
        //
        Type[] parameterTypes = new Type[rank];

        for (int i = 0; i < rank; i++)
        {
            parameterTypes[i] = typeof(int);
        }

        ilGen.Emit(OpCodes.Newobj, type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, parameterTypes, null));
        ilGen.Emit(OpCodes.Ret);

        return (Func<int[], Array>)method.CreateDelegate(typeof(Func<int[], Array>));
    }
}
类程序
{
静态void Main(字符串[]参数)
{
CreateMultidimensionalArrayCreator(typeof(int[,])。Invoke(newint[]{10,10,10});
}
静态函数CreateMultidimensionalArrayCreator(类型)
{
int rank=type.GetArrayRank();
DynamicMethod=newdynamicmethod(String.Empty,typeof(Array),newtype[]{typeof(int[])},typeof(Program),false);
ILGenerator ilGen=method.GetILGenerator();
for(int i=0;i
替换行:

ilGen.Emit(OpCodes.Ldelem_I); // Somehow returns...
行:

ilGen.Emit(OpCodes.Ldelem_I4); // Somehow returns 0 for last element....

这个程序输出了一些数字,你能告诉我们你观察到了什么和你期望的是什么,而不是像你的文字所暗示的那样留下这个吗?@LasseV.Karlsen-是一个有形的屏幕截图。我在VS2015上也得到了10,10,10你知道“原生int”是一个指针吗?对于
Int32
,应该使用
Ldelem\u I4
。不,这并不奇怪,64位上的
native int
基本上是
Int64
。顺便说一句,使用Ldelem_I4时,一切正常。我建议您将IL转储到程序集并在其上运行PEVerify。它在类型问题上出错。