J'ai récemment acheté le livre d'Ayende bâtiment DSLS à BOO (achetez-le, lisez-le, c'est génial) Mais je suis à l'encontre d'un problème de mise en œuvre et je veux voir à quoi ressemble le code généré. J'utiliserais normalement le réflecteur pour regarder le code, mais dans ce cas, les assemblages sont dynamiques et uniquement en mémoire. Existe-t-il un moyen d'enregistrer des assemblages dynamiques sur le disque afin que je puisse les refléter?
edit / ma réponse FORT>: P> wow, il a fallu un certain temps à revenir à celui-ci . Malheureusement, j'ai laissé un peu important de la question initiale. P> Bit important: J'utilise La bibliothèque de Rhinodsl d'Ayende tel qu'il recommande dans le livre. J'ai accès au compilateur BOO dans ma sous-classe de DSLengine qui ressemble à ceci: p> pour changer le moins et obtenir ce que je voulais avoir besoin d'ajouter une ligne ... P> public class JobEngine : DslEngine
{
protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
{
compiler.Parameters.GenerateInMemory = false; // <--- This one.
pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
}
}
4 Réponses :
Oui, le AssemblyBuilder Code> Classe a une méthode code> SAVE code> à cette fin. Vous devez utiliser le mode approprié pour cela, ce qui est probablement
runandsave code>:
L'assemblage est déjà construit pour moi en mémoire par le compilateur BOO. Donc, je n'ai pas accès au constructeur ...
C'est un assemblage dynamique et s'il n'a pas été sauvegardé et chargé de disque, doit être lancé vers AssemblyBuilder Code> dans ce cas.
@David M: hmm ... Quand je mets et frappe la méthode de sauvegarde, je reçois une introduction invalide qui dit qu'il a été enregistré.
Si vous pouvez obtenir l'assemblage au moment de l'exécution.
IE P>
AssemblyBuilder assemblyBuilder = (AssemblyBuilder)assembly; assemblyBuilder.Save(yourPath);
En fait, la distribution fonctionne, mais lorsque je gère la méthode de sauvegarde, il meurt que l'assembly a déjà été sauvé ...
Il peut y avoir un moyen plus facile de le faire, mais si cela ne vous dérange pas d'utiliser WINDBG, vous pouvez enregistrer un ensemble géré chargé de la mémoire (Windbg utilise le module de termes, mais cela fonctionne également pour les assemblages gérés). p>
Utilisez la commande Bien sûr, vous pouvez également regarder le code IL en mémoire. P> ! Savemodule code> avec l'adresse de l'assemblage. Si vous n'avez pas l'adresse, utilisez la commande
lm vm code> avec le nom du module. Vous pouvez suivre une assemblée DLL régulière que vous pouvez inspecter dans le réflecteur. p>
Recherchez les yeux Où Boocompiler est instancié, changez le pipeline de compilétomemorie à compiletofile p>
C'est ce qui m'a finalement amené à répondre à la réponse dont j'avais besoin pour que je vous accepte de vous accepter monsieur.
Utilisez la sérialisation de l'objet XML?!.
Créez-vous ces assemblages par codedom?