如何为具有out
-parameter 的委托定义 DynamicMethod ,像这样?
public delegate void TestDelegate(out Action a);
假设我只是想要一个在调用该方法时将a
参数设置为null
的方法。
请注意,我知道处理此问题的一种可能更好的方法是使该方法返回Action
委托,但这只是较大项目的简化部分,并且所讨论的方法已经返回了一个值,我需要处理该out
参数除此之外,还有这个问题。
我试过这个:
using System;
using System.Text;
using System.Reflection.Emit;
namespace ConsoleApplication8
{
public class Program
{
public delegate void TestDelegate(out Action a);
static void Main(String[] args)
{
var method = new DynamicMethod("TestMethod", typeof(void),
new Type[] { typeof(Action).MakeByRefType() });
var il = method.GetILGenerator();
// a = null;
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Starg, 0);
// return
il.Emit(OpCodes.Ret);
var del = (TestDelegate)method.CreateDelegate(typeof(TestDelegate));
Action a;
del(out a);
}
}
}
但是,我明白了:
VerificationException was unhandled:
Operation could destabilize the runtime.
上del(out a);
线。
请注意,如果我注释掉在堆栈上加载 null 并尝试将其存储到参数中的两行,则该方法将无异常运行。
编辑:这是最好的方法吗?
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Stind_Ref);