Guest User

Untitled

a guest
Aug 16th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. class Program {
  2. private delegate void BottlesDelegate(int input);
  3.  
  4. static void Main(string[] args) {
  5. IL();
  6.  
  7. Console.WriteLine("Done");
  8. Console.ReadLine();
  9. }
  10.  
  11. private static void IL() {
  12. var method = new DynamicMethod("Bottles", typeof (void), new[] {typeof (int)}, typeof (Program).Module);
  13. var write = typeof(Console).GetMethods(BindingFlags.Public | BindingFlags.Static).Where(x => x.Name == "WriteLine").First(x => x.GetParameters().Length == 1 && x.GetParameters()[0].ParameterType == typeof(string));
  14. var writeFormatted = typeof (Console).GetMethods(BindingFlags.Public | BindingFlags.Static).Where(x => x.Name == "WriteLine").First(x => x.GetParameters().Length == 2 && x.GetParameters()[0].ParameterType == typeof (string) && x.GetParameters()[1].ParameterType == typeof(object));
  15.  
  16. var il = method.GetILGenerator();
  17. var work = il.DefineLabel();
  18.  
  19. // Check if we have any bottles left
  20. il.Emit(OpCodes.Ldarg_0);
  21. il.Emit(OpCodes.Brtrue, work);
  22. il.Emit(OpCodes.Ldstr, "No more bottles of beer on the wall, no more bottles of beer.");
  23. il.Emit(OpCodes.Call, write);
  24. il.Emit(OpCodes.Ret);
  25.  
  26. // Print
  27. il.MarkLabel(work);
  28. il.Emit(OpCodes.Ldstr, "{0} bottles of beer on the wall, {0} bottles of beer.");
  29. il.Emit(OpCodes.Ldarg_0);
  30. il.Emit(OpCodes.Box, typeof (Int32));
  31. il.Emit(OpCodes.Call, writeFormatted);
  32.  
  33. il.Emit(OpCodes.Ldstr, "Take one down and pass it around. {0} botles of beer.");
  34. il.Emit(OpCodes.Ldarg_0);
  35. il.Emit(OpCodes.Ldc_I4, 1);
  36. il.Emit(OpCodes.Sub);
  37. il.Emit(OpCodes.Box, typeof (Int32));
  38. il.Emit(OpCodes.Call, writeFormatted);
  39.  
  40. // Subtract
  41. il.Emit(OpCodes.Ldarg_0);
  42. il.Emit(OpCodes.Ldc_I4, 1);
  43. il.Emit(OpCodes.Sub);
  44. il.Emit(OpCodes.Starg, 0);
  45.  
  46. // Recurse
  47. il.Emit(OpCodes.Ldarg_0);
  48. il.Emit(OpCodes.Call, method);
  49. il.Emit(OpCodes.Ret);
  50.  
  51. var del = method.CreateDelegate(typeof(BottlesDelegate)) as BottlesDelegate;
  52. del(99);
  53. }
  54. }
Add Comment
Please, Sign In to add comment