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

标签 c# .net clr jit reflection.emit

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

不是创建 int[10, 10, 10] 数组,而是创建 int[10, 10, 0] 数组。它似乎在 OpCodes.Ldelem_I 处出错,但是,使用 OpCodes.Ldelem, typeof(int) 就可以了。重现此行为,需要任何 CPU 设置,x86 工作正常。在调试和 Release模式下都会出现此问题。

这是一个错误吗?我无法对此进行更深入的研究,因此无法对此做出判断。

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

最佳答案

替换行:

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

到行:

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

关于c# - JIT 或 CLR 中可能存在的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148954/

相关文章:

c# - 在 Service Fabric 应用程序中下载 2 GB 文件

c# - 如何根据DataType组合 "collectionResult"

c++ - 从 DLLMain 调用托管代码

C# Soap Web 服务 WSDL

c# - .NET Core 上的 OpenFileDialog

c# - 为什么类成员的名称不能与其嵌套类之一相同?

c# - 有什么方法可以加快在 C# 中打开和散列 15,000 个小文件的速度吗?

.net - 有人可以简单解释一下如何使用 Threading.MemoryBarrier 在 .Net 中实现 'Full Fences' 吗?

c++-cli - 如何在C++/CLI中的引用类中使用 'native'指针?

c# - 将结构列表从 C# 转换为 C++