gpt4 book ai didi

c# - DynamicMethod 和输出参数?

转载 作者:太空狗 更新时间:2023-10-29 18:30:34 26 4
gpt4 key购买 nike

如何为具有 out 参数的委托(delegate)定义 DynamicMethod,就像这样?

public delegate void TestDelegate(out Action a);

假设我只是想要一个在调用方法时将 a 参数设置为 null 的方法。

请注意,我知道处理此问题的一个可能更好的方法是使方法返回 Action 委托(delegate),但这只是一个较大项目的简化部分,以及有问题的方法已经返回一个值,除此之外我还需要处理 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);

最佳答案

一个out 参数只是一个带有OutAttributeref 参数。应用于参数。

要存储到 by-ref 参数,您需要使用 stind 操作码,因为参数本身是指向对象实际位置的托管指针。

ldarg.0
ldnull
stind.ref

关于c# - DynamicMethod 和输出参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com