我的代码生成了一个方法来动态创建多维数组,假设有一个维度长度数组,但是 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/