Enregistrement d'un DynamicMethod sur le disque
-
27-10-2019 - |
Question
I ont hérité de code qui utilise DynamicMethod pour générer des méthodes à l'exécution. Je dois aussi de modifier une partie du code qui est généré.
Depuis que je suis un n00b à MSIL, j'aimerais être en mesure de charger le code généré en réflecteur et veiller à ce que le code fait ce que je prie pour que ce fait;)
Seulement, je ne peux pas comprendre comment sérialiser la « Assemblée DynamicMethods Hébergé ANONYME » sur le disque. Est-ce possible? Si oui, comment?
La solution
Je pense que si vous voulez charger la méthode dans le réflecteur ou dotPeek, vous devez créer un assemblage réel. Pour ce faire, utilisation MethodBuilder
au lieu de DynamicMethod
. La plupart de l'utilisation d'entre eux devrait être le même.
Autres conseils
Essayez ceci,
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");