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 <
advanced.dotnet.discuss.develop.com peterritchie.com>
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.c
om/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.c
om/en-
>
us/library/system.reflection.emit.assemblybuilder.aspx<http://msdn.microsoft.com
/en-us/library/system.reflection.emit.assemblybuilder.aspx&g
t;
>
> Cheers -- Peter
>
> On Thu, 17 Jul 2008 09:21:03 -0500, Mike Andrews
> <outdoor.jellyroll GMAIL.COM> 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
|