动态方法,将返回值存储在本地
本文关键字:存储 返回值 方法 动态 | 更新日期: 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;