Domanda

Recentemente ho comprato il libro di Ayende Edificio Dsl a Boo (comprarlo, leggerlo, è impressionante), ma sto venendo contro un problema di implementazione e voglio vedere che cosa il codice generato assomiglia.Io normalmente uso riflettore a guardare il codice, ma in questo caso le assemblee sono dinamici e solo in memoria.C'è un modo per salvare dinamica assemblee a disco in modo che io possa riflettere?

MODIFICA / la Mia Risposta:

Wow, ci sono voluti un po ' per tornare a questo.Purtroppo ho lasciato un importante po ' fuori dalla domanda originale.

Importante:Sto utilizzando Ayende del RhinoDSL biblioteca come egli raccomanda nel libro.Ho accesso a boo compilatore nel mio sottoclasse di DslEngine che assomiglia a questo:

public class JobEngine : DslEngine
{
    protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
    {
        pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
    }
}

Per modificare il meno possibile e ottenere quello che volevo, avevo bisogno di aggiungere una riga...

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

Questo ha causato il compilatore di uscita assieme al mio ~\impostazioni locali emp e quindi ho potuto quindi riflettere.È importante notare che fare quel cambiamento ha causato il resto del programma di pausa (RhinoDSL non riusciva più a trovare le assemblee in memoria a causa di uscita è il loro disco), quindi questo è solo utile come strumento di debug.

È stato utile?

Soluzione

Cercare dove BooCompiler viene creata un'istanza di cambiare la pipeline CompileToMemory per CompileToFile

Altri suggerimenti

Sì, l' AssemblyBuilder classe dispone di un Save metodo per questo scopo.È necessario utilizzare la modalità più appropriata per questo, che è il più probabile RunAndSave:

AssemblyBuilder builder =
    AppDomain.CurrentDomain.DefineDynamicAssembly(
        name, AssemblyBuilderAccess.RunAndSave);
// build assembly
builder.Save(path);

Se è possibile ottenere l'Assemblaggio in fase di runtime.

cioè

Assembly assembly = typeof(YourDynamicType).Assembly;

È quindi possibile lanciare questa assemblea in AssemblyBuilder e chiamare il metodo di Salvataggio.

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

Ci può essere un modo più semplice per farlo, ma se non ti dispiace utilizzando WinDbg è possibile salvare qualsiasi caricato assembly gestito dalla memoria (WinDbg usa il termine del modulo, ma funziona per assembly gestiti così).

Utilizzare il !savemodule comando con l'indirizzo dell'assemblea.Se non avete l'indirizzo di usare il lm vm comando con il nome del modulo.A seguito di che si ottiene una DLL regolare assemblea, che è possibile controllare nel Riflettore.

Naturalmente si può anche solo guardare il codice in memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top