gpt4 book ai didi

c# - "Operation could destabilize the runtime"调用动态方法时

转载 作者:行者123 更新时间:2023-11-30 20:50:13 25 4
gpt4 key购买 nike

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

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

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

我已经通过将 il 代码写入类而不是动态方法来检查 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 来获取第一个方法参数。

关于c# - "Operation could destabilize the runtime"调用动态方法时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22712424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com