LearningEmit
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Reflection;
  3. using System.Reflection.Emit;
  4. namespace EmitIntroduction
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. // specify a new assembly name
  11. var assemblyName = new AssemblyName("Kitty");
  12. // create assembly builder
  13. var assemblyBuilder = AppDomain.CurrentDomain
  14. .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
  15. // create module builder
  16. var moduleBuilder = assemblyBuilder.DefineDynamicModule("KittyModule", "Kitty.exe");
  17. // create type builder for a class
  18. var typeBuilder = moduleBuilder.DefineType("HelloKittyClass", TypeAttributes.Public);
  19. // create method builder
  20. var methodBuilder = typeBuilder.DefineMethod(
  21. "SayHelloMethod",
  22. MethodAttributes.Public | MethodAttributes.Static,
  23. null,
  24. null);
  25. // then get the method il generator
  26. var il = methodBuilder.GetILGenerator();
  27. // then create the method function
  28. il.Emit(OpCodes.Ldstr, "Hello, Kitty!");
  29. il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
  30. il.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
  31. il.Emit(OpCodes.Pop); // we just read something here, throw it.
  32. il.Emit(OpCodes.Ret);
  33. // then create the whole class type
  34. var helloKittyClassType = typeBuilder.CreateType();
  35. // set entry point for this assembly
  36. assemblyBuilder.SetEntryPoint(helloKittyClassType.GetMethod("SayHelloMethod"));
  37. // save assembly
  38. assemblyBuilder.Save("Kitty.exe");
  39. Console.WriteLine("Hi, Dennis, a Kitty assembly has been generated for you.");
  40. Console.ReadLine();
  41. }
  42. }
  43. }