操作可能会破坏运行时的稳定性.调用动态方法时
本文关键字:调用 稳定性 动态 方法 运行时 操作 | 更新日期: 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
来获得第一个方法参数