C# 无法使用reflection.emit调用参数为数组的方法

C# 无法使用reflection.emit调用参数为数组的方法,c#,reflection.emit,C#,Reflection.emit,我目前正在使用这篇文章作为指导 但是使用一维数组 我的函数看起来像 public void CallMethod3(object[] Items) { } MethodInfo invokerMethod = typeof(Foo).GetMethod("CallMethod3"); il.Emit(OpCodes.Nop); il.Emit(OpCodes.Ldarg_0); // var local = new int[1]; LocalBuilder local = il.Decla

我目前正在使用这篇文章作为指导 但是使用一维数组

我的函数看起来像

public void CallMethod3(object[] Items)
{

}
MethodInfo invokerMethod = typeof(Foo).GetMethod("CallMethod3");
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ldarg_0);

// var local = new int[1];
LocalBuilder local = il.DeclareLocal(typeof(object[]));
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Newobj, typeof(object[]).GetConstructor(new[] { typeof(int) }));
il.Emit(OpCodes.Stloc, local);

// il.Emit(OpCodes.Ldloc, local);
// il.Emit(OpCodes.Ldc_I4_0);
// il.Emit(OpCodes.Ldc_I4, 123);
// var setMethod = typeof(object[]).GetMethod("Set");
// il.Emit(OpCodes.Call, setMethod);

il.Emit(OpCodes.Ldloc, local);

il.Emit(OpCodes.Call, invokerMethod);
il.Emit(OpCodes.Ret);
我的反射发射代码看起来像

public void CallMethod3(object[] Items)
{

}
MethodInfo invokerMethod = typeof(Foo).GetMethod("CallMethod3");
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ldarg_0);

// var local = new int[1];
LocalBuilder local = il.DeclareLocal(typeof(object[]));
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Newobj, typeof(object[]).GetConstructor(new[] { typeof(int) }));
il.Emit(OpCodes.Stloc, local);

// il.Emit(OpCodes.Ldloc, local);
// il.Emit(OpCodes.Ldc_I4_0);
// il.Emit(OpCodes.Ldc_I4, 123);
// var setMethod = typeof(object[]).GetMethod("Set");
// il.Emit(OpCodes.Call, setMethod);

il.Emit(OpCodes.Ldloc, local);

il.Emit(OpCodes.Call, invokerMethod);
il.Emit(OpCodes.Ret);
一切都很好,我可以在方法上点击断点。然而,当我尝试填充对象数组(这里注释的代码)时,我开始面临问题。我开始得到无效的调用


知道我做错了什么吗?

如果你要创建一个一维数组,为什么不使用呢?我不是IL专家,但数组没有
集合
方法。您正在寻找
SetValue
?这里有一个通用提示:尝试将要生成的代码放入LINQPad并切换到IL选项卡。这可以帮助您了解实际需要的说明,并从中找到返回的方法。或者尝试。:)@罪状7:yaakov只是建议您使用SharpLab.io(作为LINQPad的替代方案)来确定哪些IL操作码用于动态生成代理,而不是编写静态代码。