C# Dynamic assembly Can't create new object and load to field

253 Views Asked by At

I am trying to create new object for given type and load it to the field, but it throws an

InvalidProgramException.

Doing same using locals works. Maybe doing something wrong with fields? This does not work:

MethodAttributes getSetAttr = MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
FieldBuilder propNameBldr = typeBuilder.DefineField("_" + PropName, PropType, FieldAttributes.Private);
propNamePropBldr = typeBuilder.DefineProperty(PropName, PropertyAttributes.HasDefault, PropType, null);
propNameGetPropMthdBldr = typeBuilder.DefineMethod("get_" + PropName, getSetAttr, PropType, Type.EmptyTypes);
ConstructorInfo baseCtor = basePropType.GetConstructor(new Type[] { });

ILGenerator propNameGetIL = propNameGetPropMthdBldr.GetILGenerator();

propNameGetIL.Emit(OpCodes.Newobj, baseCtor);
propNameGetIL.Emit(OpCodes.Stfld, PropNameBldr);

propNameGetIL.Emit(OpCodes.Ldfld, PropNameBldr);
propNameGetIL.Emit(OpCodes.Ret);
propNamePropBldr.SetGetMethod(propNameGetPropMthdBldr);

But this works:

MethodAttributes getSetAttr = MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
FieldBuilder propNameBldr = typeBuilder.DefineField("_" + PropName, PropType, FieldAttributes.Private);
propNamePropBldr = typeBuilder.DefineProperty(PropName, PropertyAttributes.HasDefault, PropType, null);
propNameGetPropMthdBldr = typeBuilder.DefineMethod("get_" + PropName, getSetAttr, PropType, Type.EmptyTypes);
ConstructorInfo baseCtor = basePropType.GetConstructor(new Type[] { });

ILGenerator propNameGetIL = propNameGetPropMthdBldr.GetILGenerator();
LocalBuilder lc = propNameGetIL.DeclareLocal(PropType);
propNameGetIL.Emit(OpCodes.Newobj, baseCtor);
propNameGetIL.Emit(OpCodes.Stloc, PropNameBldr);

propNameGetIL.Emit(OpCodes.Ldloc, PropNameBldr);
propNameGetIL.Emit(OpCodes.Ret);
propNamePropBldr.SetGetMethod(propNameGetPropMthdBldr);

So what is the difference and why first not working? Thanks.

1

There are 1 best solutions below

6
usr On BEST ANSWER

Non-static fields need an object reference.

A better way to generate IL is to use expression trees.

Also, you can answer all such questions yourself by writing the equivalent code in C# and decompiling the compiler output.