C# 动态方法,将返回值存储在本地
我在使用动态方法时遇到了一些问题。此方法的(伪)IL代码如下所示C# 动态方法,将返回值存储在本地,c#,dynamic,il,C#,Dynamic,Il,我在使用动态方法时遇到了一些问题。此方法的(伪)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,
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导致异常:
系统安全验证例外情况:Dieser Vorgang kann die Laufzeit不稳定。
(在英语中,这意味着运行时可能会不稳定)
我以前在堆栈不正确时有过这种情况,但在本例中,堆栈是正确的。最后用一个简单的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
声明为返回generiobject
实例
除非generiobject
类扩展了IntegerObject
类,否则不能将对generiobject
实例的引用存储在IntegerObject
变量中。C#编译器将向您提供以下错误消息:
无法将类型“GenericObject”隐式转换为“IntegerObject”
假设IntegerObject
扩展了GenericObject
,解决方案是添加一个cast-like
IntegerObject localB = (IntegerObject)getGlobal("a");
或
您是否尝试过使用您的方法创建程序集,保存该程序集并在其上运行PEVerify?这通常会给出更好的错误信息。很好!当我遇到下一个问题时,我会尝试。谢谢,我认为C铸造只是C++中的编译时间,而且是隐式的。现在可以完美地工作了!如果
IntegerObject
派生自generiobject
,则可以在generiobject
变量中存储IntegerObject
,而无需强制转换。但是,由于并非所有的generiobject
s都是IntegerObject
s,因此在没有强制转换的IntegerObject
变量中不能存储generiobject
。
IntegerObject localB = getGlobal("a") as IntegerObject;