IL用基类方法调用发射



如何修改此il-emit代码以在getter和setter中的基类中调用方法?无论我做什么,我都会得到无效的摄影。

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具有对实例的引用。在通话说明之前发出额外的LDARG0指令。如果该方法具有非流动返回类型,则您还需要发出POP指令以从堆栈中删除返回值或在其他指令中使用它。

最新更新