Сохранение DynamicMethod на диск - PullRequest
5 голосов
/ 14 июня 2011

Я унаследовал код, который использует DynamicMethod для генерации методов во время выполнения. Мне также нужно изменить код, который генерируется.

Поскольку я n00b в MSIL, я бы хотел иметь возможность загрузить сгенерированный код в Reflector и убедиться, что код выполняет то, что я молюсь, чтобы он делал;)

Только я не могу понять, как сериализовать «анонимно размещенную сборку DynamicMethods» на диск. Это возможно? Если да, то как?

Ответы [ 2 ]

6 голосов
/ 06 июля 2011

Попробуйте,

  var assemblyName = new AssemblyName("SomeName");
  var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave, @"c:");
  var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name +  ".dll");

  TypeBuilder builder = moduleBuilder.DefineType("Test", TypeAttributes.Public);
  var methodBuilder = builder.DefineMethod("DynamicCreate", MethodAttributes.Public, typeof(T), new[] { typeof(IDataRecord) }); 
  /* this line is a replacement for your  new DynamicMethod(....)  line of code

  /* GENERATE YOUR IL CODE HERE */

  var t = builder.CreateType();
  assemblyBuilder.Save(assemblyName.Name + ".dll");
2 голосов
/ 15 июня 2011

Я думаю, что если вы хотите загрузить метод в Reflector или dotPeek, вам нужно создать реальную сборку. Для этого используйте MethodBuilder вместо DynamicMethod. Большинство из них должны быть одинаковыми.

...