C# JIT或CLR中可能存在的错误
我的代码生成了一个方法,假设维度长度数组,动态创建多维数组,但是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
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。它在类型问题上出错。