gpt4 book ai didi

c# - 调用基类的事件处理程序的 MSIL 是什么?

转载 作者:太空狗 更新时间:2023-10-30 00:47:37 27 4
gpt4 key购买 nike

我有一个名为 EventConsumer 的类,它定义了一个事件 EventConsumed 和一个方法 OnEventConsumed,如下所示:

public event EventHandler EventConsumed;

public virtual void OnEventConsumed(object sender, EventArgs e)
{
if (EventConsumed != null)
EventConsumed(this, e);
}

我需要将属性添加到 at OnEventConsumed 运行时,因此我使用 System.Reflection.Emit 生成了一个子类。我想要的是与此等效的 MSIL:

public override void OnEventConsumed(object sender, EventArgs e)
{
base.OnEventConsumed(sender, e);
}

我目前的情况是这样的:

...

MethodInfo baseMethod = typeof(EventConsumer).GetMethod("OnEventConsumed");
MethodBuilder methodBuilder = typeBuilder.DefineMethod("OnEventConsumed",
baseMethod.Attributes,
baseMethod.CallingConvention,
typeof(void),
new Type[] {typeof(object),
typeof(EventArgs)});

ILGenerator ilGenerator = methodBuilder.GetILGenerator();

// load the first two args onto the stack
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Ldarg_2);

// call the base method
ilGenerator.EmitCall(OpCodes.Callvirt, baseMethod, new Type[0] );

// return
ilGenerator.Emit(OpCodes.Ret);

...

我创建了类型,创建了类型的实例,并调用了它的 OnEventConsumed 函数,然后我得到:

Common Language Runtime detected an invalid program.

...这不是很有帮助。我究竟做错了什么?调用基类的事件处理程序的正确 MSIL 是什么?

最佳答案

这是来自示例应用的 IL:


.method public hidebysig virtual instance void OnEventConsumed(object sender, class [mscorlib]System.EventArgs e) cil managed
{
.maxstack 8
L_0000: nop
L_0001: ldarg.0
L_0002: ldarg.1
L_0003: ldarg.2
L_0004: call instance void SubclassSpike.BaseClass::OnEventConsumed(object, class [mscorlib]System.EventArgs)
L_0009: nop
L_000a: ret
}

所以我认为您没有加载实例是因为您没有执行 ldarg.0

关于c# - 调用基类的事件处理程序的 MSIL 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268778/

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