gpt4 book ai didi

c# - 动态方法,将返回值存储在本地

转载 作者:行者123 更新时间:2023-11-30 22:18:46 25 4
gpt4 key购买 nike

我在使用动态方法时遇到了一些问题。此方法的(伪)IL 代码如下所示

var localB = dynMethodGen.DeclareLocal(typeof(Runtime.IntegerObject));
dynMethodGen.Emit(Ldc_I8, 2);
dynMethodGen.Emit(Newobj, Runtime.IntegerObject.Constructor);
dynMethodGen.Emit(ldstr, "a");
dynMethodGen.Emit(call, GlobalDeclaratorManager.SetMethod);
dynMethodGen.Emit(ldstr, "a");
dynMethodGen.Emit(call, GlobalDeclaratorManager.GetMethod);
dynMethodGen.Emit(Stloc, localB);

使用这段代码我遇到了以下问题:最终的 STLoc 导致异常:System.Security.VerificationException:Dieser Vorgang kann die Laufzeit destabilisieren。(在英语中,这意味着运行时可能不稳定)。

我之前遇到过堆栈不正确的情况,但在这种情况下堆栈是正确的。最后用简单的 Pop 替换 STLoc 一切正常,除了该值未存储在语言环境中。

Get 和 Set 方法如下所示:

        public static GenericObject getGlobal(string name)
{
return mDeclarators[name];
}

public static void setGlobal(GenericObject value, string name)
{
mDeclarators[name] = value;
}

同样有效的是用另一个对 SetMethod 的调用替换 STLoc,值被正确传递。

我是否缺少某种限制?我不能在语言环境中存储函数的返回值吗?

最佳答案

你要做的是

setGlobal(new IntegerObject(2), "a");

IntegerObject localB = getGlobal("a");

其中 getGlobal 被声明为返回一个 GenericObject 实例。

您不能将对 GenericObject 实例的引用存储在 IntegerObject 变量中,除非 GenericObject 类扩展了 IntegerObject类。 C# 编译器会给出以下错误消息:

Cannot implicitly convert type 'GenericObject' to 'IntegerObject'

假设 IntegerObject 扩展了 GenericObject,解决方案是添加一个类型转换,例如

IntegerObject localB = (IntegerObject)getGlobal("a");

IntegerObject localB = getGlobal("a") as IntegerObject;

关于c# - 动态方法,将返回值存储在本地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15914628/

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