Ist es möglich, eine dynamische assembly auf der Festplatte?
Ich kaufte vor kurzem Ayende Buch Bau von DSLs in Boo (kaufen Sie es, Lesen Sie es, es ist genial), aber ich komme gegen ein Umsetzung problem und ich möchte sehen, was der generierte code aussieht. Ich normalerweise verwenden würden, Reflektor Blick auf den code werfen, aber in diesem Fall die Baugruppen sind dynamisch und nur im Arbeitsspeicher. Gibt es eine Möglichkeit zum speichern von dynamischen Assemblys auf der Festplatte, so dass ich Sie abzubilden?
BEARBEITEN /Meine Antwort:
Wow, es dauerte eine Weile, um zu kommen zurück zu dieser. Leider verließ ich eine wichtige bisschen von der ursprünglichen Frage.
Wichtige Teil: ich bin mit Ayende ist RhinoDSL Bibliothek, denn er empfiehlt im Buch. Ich habe Zugang zu den boo compiler in meiner Unterklasse von DslEngine die wie folgt aussieht:
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"));
}
}
Ändern Sie die Beine und bekommen, was ich wollte, ich brauchte, um fügen Sie eine Zeile...
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"));
}
}
Dadurch verursacht, dass der compiler die Ausgabe der Montage an meiner ~\LocalSettings zuzugreifen\Temp-Verzeichnis und dann könnte ich dann entsprechend an. Es ist wichtig zu beachten, dass die Herstellung, die änderung verursacht den rest des Programms zu brechen (RhinoDSL konnte keine mehr finden die Versammlungen im Gedächtnis, weil ich die Ausgabe auf die Festplatte), so ist dies nur sinnvoll, wie ein debugging-tool.
- Mit dem Objekt-XML-Serialisierung?!.
- tun Sie erstellen, die Assemblys über CodeDom?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachschlagen, wo BooCompiler instanziiert wird, ändern Sie die pipeline aus CompileToMemory zu CompileToFile
Ja, die
AssemblyBuilder
Klasse hat eineSave
Methode für diesen Zweck. Müssen Sie den geeigneten Modus für das, was am ehestenRunAndSave
:AssemblyBuilder
in diesem Fall.Wenn du die Assembly zur Laufzeit.
d.h.
Kann man dann warf diese Versammlung in AssemblyBuilder und die Save-Methode aufrufen.
Möglicherweise gibt es einen einfacheren Weg, es zu tun, aber wenn Sie nichts dagegen haben, mit WinDbg können Sie speichern Sie alle geladenen verwalteten assembly aus dem Speicher (WinDbg verwendet den Begriff Modul, aber es funktioniert für verwaltete Assemblys als gut).
Verwenden Sie die
!savemodule
- Befehl mit der Adresse der Baugruppe. Wenn Sie nicht über die Adresse verwenden, dielm vm
Befehl mit dem Modul-Namen. Nach, die Sie erhalten eine reguläre DLL-assembly, die Sie überprüfen können, in den Reflektor.Natürlich können Sie auch nur Aussehen bei der IL-code in den Speicher.