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

本文关键字:存储 返回值 方法 动态 | 更新日期: 2023-09-27 18:08:34

我遇到了一些动态方法的问题。此方法的(伪)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: diesel Vorgang kann die Laufzeit instability - isieren。(在英语中,意思是运行时可能不稳定)。

我以前在堆栈不正确的时候有过这个,但在这种情况下堆栈是正确的。最后用一个简单的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的实例。

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

不能隐式地将"GenericObject"类型转换为"IntegerObject"类型

假设IntegerObject扩展了GenericObject,解决方案是添加像

这样的强制转换
IntegerObject localB = (IntegerObject)getGlobal("a");

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