IL 发出基本 class 方法调用?

IL emit with base class method invocation?

如何修改此 IL-emit-code 以包括在 getter 和 setter 中调用基 class 中的方法?无论我做什么,我都会得到 InvalidProgramException。

FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);

PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
ILGenerator getIl = getPropMthdBldr.GetILGenerator();

getIl.Emit(OpCodes.Ldarg_0);

//getIl.Emit(OpCodes.Call, baseType.GetMethod("Test"));

getIl.Emit(OpCodes.Ldfld, fieldBuilder);
getIl.Emit(OpCodes.Ret);

MethodBuilder setPropMthdBldr =
    tb.DefineMethod("set_" + propertyName,
      MethodAttributes.Public |
      MethodAttributes.SpecialName |
      MethodAttributes.HideBySig,
      null, new[] { propertyType });

ILGenerator setIl = setPropMthdBldr.GetILGenerator();

Label modifyProperty = setIl.DefineLabel();
Label exitSet = setIl.DefineLabel();

setIl.MarkLabel(modifyProperty);

//setIl.Emit(OpCodes.Call, baseType.GetMethod("Test"));

setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Stfld, fieldBuilder);

setIl.Emit(OpCodes.Nop);
setIl.MarkLabel(exitSet);
setIl.Emit(OpCodes.Ret);

propertyBuilder.SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);

调用实例方法时,您需要在计算堆栈上拥有实例。由于您正在发出实例 属性,arg 0 具有对该实例的引用。在 call 指令之前发出附加的 ldarg0 指令。如果该方法具有 non-void return 类型,您还需要发出弹出指令以从堆栈中删除 return 值或在其他指令中使用它。