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

本文关键字:调用 稳定性 动态 方法 运行时 操作 | 更新日期: 2023-09-27 17:54:41

我正试图正确的一个函数,我可以用来访问一个属性的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

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

您应该使用OpCodes.Ldarg_0而不是OpCodes.Ldarg_1来获得第一个方法参数