/src/PostWeaver/Program.cs

http://github.com/philiplaureano/LinFu · C# · 131 lines · 106 code · 25 blank · 0 comment · 21 complexity · 939a4841ff92df6371993b456bbb7586 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using LinFu.AOP.Cecil;
  6. using LinFu.AOP.Cecil.Extensions;
  7. using LinFu.AOP.Cecil.Interfaces;
  8. using LinFu.AOP.Interfaces;
  9. using LinFu.Reflection;
  10. using LinFu.Reflection.Emit;
  11. using Mono.Cecil;
  12. namespace PostWeaver
  13. {
  14. internal class Program
  15. {
  16. private static void Main(string[] args)
  17. {
  18. if (args == null || args.Length == 0)
  19. {
  20. ShowHelp();
  21. return;
  22. }
  23. var inputFile = args[0];
  24. if (!File.Exists(inputFile))
  25. throw new FileNotFoundException(inputFile);
  26. var targetFile = inputFile;
  27. var assembly = AssemblyDefinition.ReadAssembly(targetFile);
  28. var targetDirectory = Path.GetDirectoryName(targetFile);
  29. var filenameWithoutExtension = Path.GetFileNameWithoutExtension(targetFile);
  30. var pdbFileName = string.Format("{0}.pdb", filenameWithoutExtension);
  31. var pdbExists = File.Exists(pdbFileName);
  32. var module = assembly.MainModule;
  33. InterceptMethodCalls(assembly, targetDirectory);
  34. InterceptNewInstances(assembly, targetDirectory);
  35. InterceptMethodBodies(assembly, targetDirectory);
  36. InterceptFields(assembly, targetDirectory);
  37. InterceptExceptions(assembly, targetDirectory);
  38. assembly.Save(targetFile);
  39. Console.WriteLine("PostWeaving Assembly '{0}' -> '{0}'", targetFile);
  40. }
  41. private static void InterceptExceptions(AssemblyDefinition assembly, string targetDirectory)
  42. {
  43. var methodFilter = LoadFirstInstanceOf<IMethodFilter>(targetDirectory);
  44. if (methodFilter != null)
  45. {
  46. assembly.InterceptExceptions(methodFilter);
  47. return;
  48. }
  49. assembly.InterceptAllExceptions();
  50. }
  51. private static void InterceptFields(AssemblyDefinition assembly, string targetDirectory)
  52. {
  53. var fieldFilter = LoadFirstInstanceOf<IFieldFilter>(targetDirectory);
  54. var hostTypeFilter = LoadFirstInstanceOf<ITypeFilter>(targetDirectory);
  55. if (fieldFilter != null && hostTypeFilter != null)
  56. {
  57. assembly.InterceptFields(hostTypeFilter, fieldFilter);
  58. return;
  59. }
  60. assembly.InterceptAllFields();
  61. }
  62. private static void InterceptMethodBodies(AssemblyDefinition assembly, string targetDirectory)
  63. {
  64. var methodFilter = LoadFirstInstanceOf<IMethodFilter>(targetDirectory);
  65. if (methodFilter != null)
  66. {
  67. assembly.InterceptMethodBody(methodFilter);
  68. return;
  69. }
  70. assembly.InterceptAllMethodBodies();
  71. }
  72. private static void InterceptNewInstances(AssemblyDefinition assembly, string targetDirectory)
  73. {
  74. var newInstanceFilter = LoadFirstInstanceOf<INewInstanceFilter>(targetDirectory);
  75. var methodFilter = LoadFirstInstanceOf<IMethodFilter>(targetDirectory);
  76. if (newInstanceFilter != null && methodFilter != null)
  77. {
  78. assembly.InterceptNewInstances(newInstanceFilter, methodFilter);
  79. return;
  80. }
  81. assembly.InterceptAllNewInstances();
  82. }
  83. private static void InterceptMethodCalls(AssemblyDefinition assembly, string sourceDirectory)
  84. {
  85. var methodCallFilter = LoadFirstInstanceOf<IMethodCallFilter>(sourceDirectory);
  86. var hostMethodFilter = LoadFirstInstanceOf<IMethodFilter>(sourceDirectory);
  87. if (methodCallFilter != null && hostMethodFilter != null)
  88. {
  89. assembly.InterceptMethodCalls(methodCallFilter, hostMethodFilter);
  90. return;
  91. }
  92. assembly.InterceptAllMethodCalls();
  93. }
  94. private static T LoadFirstInstanceOf<T>(string sourceDirectory)
  95. where T : class
  96. {
  97. var items = new List<T>();
  98. items.LoadFrom(sourceDirectory, "*.filters.dll");
  99. return items.FirstOrDefault();
  100. }
  101. private static void ShowHelp()
  102. {
  103. Console.WriteLine("PostWeaver syntax: PostWeaver [filename]");
  104. }
  105. }
  106. }