调用动态方法时,“操作可能会破坏运行时的稳定性”

时间:2014-03-28 12:08:25

标签: c# reflection reflection.emit

我正在尝试使用Func,我可以使用它来访问属性的get方法,但是遇到了绊脚石。

下面的动态方法创建得很好,但是当它被调用时,我得到以下错误。

VerificationException,Operation可能会破坏运行时的稳定性。

我已经检查过il代码通过将它写入类而不是动态方法来发出有效函数,并且所有函数看起来都没问题。

我猜它与某些打字问题有关,但我不确定在哪里,所以感谢任何帮助。

示例类

public class DemoClass
{
    public string Property{get;set;}
}

动态方法创建

var getMethods = new DynamicMethod(string.Empty,
                                   typeof(string),
                                   new Type[] {typeof(object) });
var ilGet = getMethods.GetILGenerator();
var falseGetLabel = ilGet.DefineLabel();

ilGet.Emit(OpCodes.Ldarg_1);
ilGet.Emit(OpCodes.Isinst, typeof(DemoClass));
ilGet.Emit(OpCodes.Brfalse_S, falseGetLabel);
ilGet.Emit(OpCodes.Ldarg_1);
ilGet.Emit(OpCodes.Isinst, typeof(DemoClass));
ilGet.Emit(OpCodes.Call, typeof(DemoClass).GetProperty("Property").GetMethod);
ilGet.Emit(OpCodes.Ret);
ilGet.MarkLabel(falseGetLabel);
ilGet.Emit(OpCodes.Newobj,
           typeof(InvalidOperationException).GetConstructor(Type.EmptyTypes));
ilGet.Emit(OpCodes.Throw);

var f = (Func<object,string>)getMethods.CreateDelegate(
                                           typeof(Func<object,string>));

var x = new DemoClass{Property = "9"};

Console.WriteLine(f(x)); <--- fails here

1 个答案:

答案 0 :(得分:4)

您应该使用OpCodes.Ldarg_0代替OpCodes.Ldarg_1来获取第一个方法参数。