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

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,

我在使用动态方法时遇到了一些问题。此方法的(伪)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导致异常: 系统安全验证例外情况: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;