10
votes

Est-il possible d'enregistrer un assemblage dynamique sur le disque?

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> xxx pré>

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"));
    }
}


2 commentaires

Utilisez la sérialisation de l'objet XML?!.


Créez-vous ces assemblages par codedom?


4 Réponses :


4
votes

Oui, le AssemblyBuilder Classe a une méthode SAVE à cette fin. Vous devez utiliser le mode approprié pour cela, ce qui est probablement runandsave : xxx


3 commentaires

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 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é.



0
votes

Si vous pouvez obtenir l'assemblage au moment de l'exécution.

IE P>

AssemblyBuilder assemblyBuilder = (AssemblyBuilder)assembly;
assemblyBuilder.Save(yourPath);


1 commentaires

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é ...



1
votes

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).

Utilisez la commande ! Savemodule avec l'adresse de l'assemblage. Si vous n'avez pas l'adresse, utilisez la commande lm vm avec le nom du module. Vous pouvez suivre une assemblée DLL régulière que vous pouvez inspecter dans le réflecteur.

Bien sûr, vous pouvez également regarder le code IL en mémoire.


0 commentaires

5
votes

Recherchez les yeux Où Boocompiler est instancié, changez le pipeline de compilétomemorie à compiletofile


1 commentaires

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.