Advertisement
Guest User

Saving Dynamic Module

a guest
May 22nd, 2015
478
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.88 KB | None | 0 0
  1. using System;
  2. using System.Reflection;
  3. using System.Reflection.Emit;
  4. using System.Threading;
  5.  
  6. namespace reflectionExperiment
  7. {
  8.     class myCLass
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             var myType = ClassBuilder.BuildDynamicType();
  13.             var myObj = Activator.CreateInstance(myType);
  14.            
  15.         }
  16.     }
  17.  
  18.  
  19.     public class SWTTFields
  20.     {
  21.         public string fieldName;
  22.         public int startPosition;
  23.         public int endPosition;
  24.  
  25.         public static SWTTFields ISO = new SWTTFields("ISO", 1, 2);
  26.         public static SWTTFields EPC = new SWTTFields("EPC", 3, 4);
  27.  
  28.         private SWTTFields(String fieldName, Int32 startPositon, Int32 endPositon)
  29.         {
  30.             this.fieldName = fieldName;
  31.                 this.startPosition = startPositon;
  32.                 this.endPosition = endPositon;
  33.         }
  34.     }
  35.  
  36.     class ClassBuilder
  37.     {
  38.  
  39.         public static Type BuildDynamicType()
  40.         {
  41.             AppDomain myDomain = Thread.GetDomain();
  42.             AssemblyName myAsmName = new AssemblyName();
  43.             myAsmName.Name = "MyDynamicAssembly";
  44.  
  45.             // To generate a persistable assembly, specify AssemblyBuilderAccess.RunAndSave.
  46.             AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(myAsmName,
  47.                                                             AssemblyBuilderAccess.RunAndSave);
  48.             // Generate a persistable single-module assembly.
  49.             ModuleBuilder myModBuilder =
  50.                 myAsmBuilder.DefineDynamicModule("ModuleOne", "ModuleOne.dll", true);
  51.  
  52.             TypeBuilder myTypeBuilder = myModBuilder.DefineType("SWT",
  53.                                                             TypeAttributes.Public);
  54.  
  55.             FieldBuilder fieldName_field = myTypeBuilder.DefineField("fieldName",
  56.                                                             typeof(string),
  57.                                                             FieldAttributes.Public);
  58.  
  59.             FieldBuilder startPosition_field = myTypeBuilder.DefineField("startPosition",
  60.                                                             typeof(int),
  61.                                                             FieldAttributes.Public);
  62.  
  63.             FieldBuilder endPosition_field = myTypeBuilder.DefineField("endPosition",
  64.                                                            typeof(int),
  65.                                                            FieldAttributes.Public );
  66.  
  67.             FieldBuilder ISO_field =
  68.                 myTypeBuilder.DefineField("ISO",myTypeBuilder.GetType(),
  69.                                           FieldAttributes.Public | FieldAttributes.Static);
  70.  
  71.  
  72.             FieldBuilder EPC_field =
  73.                 myTypeBuilder.DefineField("EPC", myTypeBuilder.GetType(),
  74.                                           FieldAttributes.Public | FieldAttributes.Static);
  75.  
  76.             // create instance parameterless ctor
  77.             var parameterlessCtor = myTypeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
  78.  
  79.             //Instance private ctor
  80.             //parameters: stringFieldName, int StartPosition, int endPositio
  81.             var instanceCtor = myTypeBuilder.DefineConstructor(MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, CallingConventions.Standard,
  82.                 new Type[] { typeof(string), typeof(int), typeof(int) });
  83.             // generate IL
  84.             ILGenerator ILGener_instance = instanceCtor.GetILGenerator();
  85.             //pass "this"
  86.             ILGener_instance.Emit(OpCodes.Ldarg_0);
  87.             //call baseclass ctor
  88.             ILGener_instance.Emit(OpCodes.Call, typeof(Object).GetConstructor(Type.EmptyTypes));
  89.             // ???
  90.             ILGener_instance.Emit(OpCodes.Nop);
  91.             ILGener_instance.Emit(OpCodes.Nop);
  92.  
  93.             //store first argument
  94.             ILGener_instance.Emit(OpCodes.Ldarg_0);
  95.             ILGener_instance.Emit(OpCodes.Ldarg_1);
  96.             ILGener_instance.Emit(OpCodes.Stfld, fieldName_field);
  97.  
  98.             //store second argument
  99.             ILGener_instance.Emit(OpCodes.Ldarg_0);
  100.             ILGener_instance.Emit(OpCodes.Ldarg_2);
  101.             ILGener_instance.Emit(OpCodes.Stfld, startPosition_field);
  102.  
  103.             //store third argument
  104.             ILGener_instance.Emit(OpCodes.Ldarg_0);
  105.             ILGener_instance.Emit(OpCodes.Ldarg_2);
  106.             ILGener_instance.Emit(OpCodes.Stfld, endPosition_field);
  107.  
  108.             ILGener_instance.Emit(OpCodes.Nop);
  109.             ILGener_instance.Emit(OpCodes.Ret); // done, return
  110.  
  111.             //Static ctor (MethodAttributes already preset for static ctor)
  112.             var staticCtor = myTypeBuilder.DefineTypeInitializer();
  113.             ILGenerator ILGener_static = staticCtor.GetILGenerator();
  114.  
  115.             //Load "ISO" string onto stack
  116.             ILGener_static.Emit(OpCodes.Ldstr, "ISO");
  117.             //load integer 1 & 2 into stack
  118.             ILGener_static.Emit(OpCodes.Ldc_I4, 1);
  119.             ILGener_static.Emit(OpCodes.Ldc_I4, 2);
  120.  
  121.             // new object
  122.             ILGener_static.Emit(OpCodes.Newobj, instanceCtor);
  123.             ILGener_static.Emit(OpCodes.Stsfld, ISO_field);
  124.  
  125.             //Load "ISO" string onto stack
  126.             ILGener_static.Emit(OpCodes.Ldstr, "EPC");
  127.             //load integer 1 & 2 into stack
  128.             ILGener_static.Emit(OpCodes.Ldc_I4, 3);
  129.             ILGener_static.Emit(OpCodes.Ldc_I4, 4);
  130.  
  131.             ILGener_static.Emit(OpCodes.Newobj, instanceCtor);
  132.             ILGener_static.Emit(OpCodes.Stsfld, EPC_field);
  133.             ILGener_static.Emit(OpCodes.Ret); //done, return
  134.  
  135.             // Save the assembly so it can be examined with Ildasm.exe,
  136.             // or referenced by a test program.
  137.             myAsmBuilder.Save("ModuleOne.dll");
  138.             return myTypeBuilder.CreateType();
  139.         }
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement