Bonjour !
Je commence à jouer un peu avec Reflexion.Emit et je viens d'apprendre quelque chose de très intéressant. Les assemblys créés via Reflexion.Emit peuvent être déchargés !!!
Ne pas pouvoir décharger les assembly est pour moi une très grande limitation. En effet, le logiciel sur lequel je travail génère énormément d'assembly à partir de paramètres en base. Ces paramètres peuvent changer de temps à autre impliquant qu'il faut recompiler les assemblys et les recharger.
Du coup les assemblys inutilisées s'accumulent au cours de la vie du processus.
Je sais qu'il y a moyen de décharger les assembly en déchargeant l'AppDomain, mais ça implique de gérer plusieurs AppDomains et de faire de la sérialisation pour la communication entre chaque AppDomain, en plus il faudrait presque faire un AppDomain par assembly, ce n'est donc juste pas tenable en terme de performance (sans compter la complexité du code).
C'est pourquoi je commence à me dire que Reflexion.Emit pourrait me servir.
Actuellement, j'ai des bouts de code VB et C# en base, et je les compiles sous forme d'assembly via des CodeProvider (CSharpCodeProvider et VBCodeProvider).
Résultat, je me demande s'il n'y aurait pas moyen de faire une sorte de "DynamicAssemblyLoader" qui lirait le code IL d'une assembly pour en faire un Reflexion.Emit, du coup l'assembly serait chargée mais sous la forme d'une DynamicAssembly.
Ou quelque chose du genre.
Vous savez si c'est possible ? Peut-être que ça existe déjà ? Je n'ai pas trouvé. Je sais par contre qu'il existe des choses telles que "Mono.Cecil" qui devrait assurer la partie lecture de l'IL.
D'autres idées ?
Merci bien de votre aide![]()









Répondre avec citation
Partager