IL通过基类方法调用发出?

时间:2018-02-23 19:51:47

标签: c# cil generated-code

如何修改此IL-emit-code以包括在getter和setter中调用基类中的方法?无论我做什么,我都会得到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);

0 个答案:

没有答案