Thanks Peter.
The example you have is pretty much what I have figured out.

I spend a lot of trial and terror to figure out some of this stuff.
Part of the problem was that I was not seeing any reflected code in
Reflector.  I figured out that I needed to set the emitSymbolInfo parameter
on the AssemblyBuilder.DefineDynamicModule method.  Once I figured that out
I was able to use a combination of Reflection and ILDASM to figure out what
opcodes I needed to implement to make properties on the class.

Now I've been able to make a dynamic class with dynamic properties.

Thanks,
Mike

On Thu, Jul 17, 2008 at 1:05 PM, Peter Ritchie <
[EMAIL PROTECTED]> wrote:

> If you provide example code we can probably point out what's missing/needs-
> correction.  I don't know off hand how you can write a valid assembly to
> disk without being able to read types with Reflector/ILDASM.
>
> Here's the most simple case of dynamnically creating an assembly:
>  AssemblyName assemblyName = new AssemblyName("dynamicAssembly");
>  AssemblyBuilder assemblyBuilder =
> AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName,
> AssemblyBuilderAccess.Save);
>  ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule
> (assemblyName.Name, assemblyName.Name + ".dll");
>  TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType",
> TypeAttributes.Public);
>
>  typeBuilder.CreateType();
>  assemblyBuilder.Save(Path.GetFileName
> (moduleBuilder.FullyQualifiedName));
>
> ...which loads fine in Reflector.
>
> For a property with a getter and a setter, the following between the call
> to DefineType and CreateType has worked for me:
>  // define a field for the property
>  FieldBuilder fieldBuilder = typeBuilder.DefineField("value",
> typeof (int), FieldAttributes.Private);
>
>  // define the property
>  PropertyBuilder propertyBuilder = typeBuilder.DefineProperty
> ("Value", PropertyAttributes.HasDefault, typeof (int), null);
>  // define the property getter
>  MethodBuilder methodBuilder = typeBuilder.DefineMethod("get_Value",
>
> MethodAttributes.Public | MethodAttributes.SpecialName |
>
> MethodAttributes.HideBySig,
>                                                        typeof
> (int),
>
> Type.EmptyTypes);
>  // emit the body of the getter
>  ILGenerator ilGenerator = methodBuilder.GetILGenerator();
>  ilGenerator.Emit(OpCodes.Ldarg_0);
>  ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
>  ilGenerator.Emit(OpCodes.Ret);
>
>  // attach the getter to the property
>  propertyBuilder.SetGetMethod(methodBuilder);
>
>  // define the property setter
>  methodBuilder = typeBuilder.DefineMethod("set_Value",
>                                          MethodAttributes.Public |
> MethodAttributes.SpecialName |
>
> MethodAttributes.HideBySig,
>                                          null,
>                                          new Type[] {typeof
> (int)});
>
>  // emit the body of the setter
>  ilGenerator = methodBuilder.GetILGenerator();
>  ilGenerator.Emit(OpCodes.Ldarg_0);
>  ilGenerator.Emit(OpCodes.Ldarg_1);
>  ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
>  ilGenerator.Emit(OpCodes.Ret);
>
>  // attach the setter to the property
>  propertyBuilder.SetSetMethod(methodBuilder);
>
> Documentation in-and-around http://msdn.microsoft.com/en-
> us/library/4xtysk39.aspx<http://msdn.microsoft.com/en-us/library/4xtysk39.aspx>usually
>  has enough info for what I'm usually
> doing.
> For example: http://msdn.microsoft.com/en-
> us/library/system.reflection.emit.assemblybuilder.aspx<http://msdn.microsoft.com/en-us/library/system.reflection.emit.assemblybuilder.aspx>
>
> Cheers -- Peter
>
> On Thu, 17 Jul 2008 09:21:03 -0500, Mike Andrews
> <[EMAIL PROTECTED]> wrote:
>
> >I'm needing to do some dynamic code generation.
> >I've been reading up on the Reflection.Emit namespace but I'm having some
> >issues.
> >When I compile a dynamic assembly and then save to disk, I can't read the
> >types from it in Reflector or ILDASM.
> >
> >Do any of you have any good tutorials or sample code I might examine?
> >
> >I mainly want to create a dynamic class with read/write properties.
>
> ===================================
> This list is hosted by DevelopMentor(R)  http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com
>

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to