2009-11-15 5 views
7

Ich habe einige Typen dynamisch mit System.CodeDom.CodeCompileUnit erstellt, möchte diese in IL-Code im Arbeitsspeicher kompilieren und diesen IL-Code in eine Assembly im Arbeitsspeicher einfügen - es ist nicht nötig, diese auf der Festplatte zu speichern. Vielleicht ist mein erklärter Plan falsch. Öffnen Sie weitere Vorschläge zum Abrufen der CodeCompileUnit-Instanz an das angegebene Ziel.Wie kann ich Code ausgeben und in eine geladene Baugruppe injizieren?

+1

Warum müssen Sie die Typen in eine bereits geladene Baugruppe injizieren? Warum können Sie sie nicht in eine Baugruppe injizieren, die Sie gerade bauen? – yfeldblum

+1

@Justice: Das ist ein guter Punkt - es ist eine Neugier mehr als alles andere. Ich nehme an, wenn ich Szenarien erfinden musste, sind: die Dateisystemberechtigungen über das Bauen von Baugruppen zu umgehen, indem einfach im Speicher gearbeitet wird; Oder vielleicht, um Code in eine Assembly einzufügen und ihn dynamisch aufzurufen, um Dinge zu überprüfen, ohne die App neu kompilieren zu müssen. –

+0

Ich bin mir nicht sicher, ob es einen Weg gibt, dies zu tun. Wenn ja, würde ich es gerne wissen. –

Antwort

7

Sie können Code in ein vorhandenes (bereits geladen) injizieren Montage ICorDebug Schnittstellen. Bearbeiten und Weiter macht es.

Berechnen Sie Ihre Delta-Bytes und ICorDebugModule2::ApplyChanges nennen. Weitere Informationen finden Sie unter MDbg sample code.

einmal haben wir ICorDebugModule::GetEditAndContinueSnapshot und Verwandten, aber diese sind jetzt veraltet.

aktualisieren Wenn Sie sich über die Injektion Code in eine bereits geladene Assembly sich nicht, nur Reflection.Emit mit einer neuen Baugruppe zu schaffen, ist effizienter und viel einfacher.

+0

Diese Lösung beantwortet direkt die Frage. Vielen Dank. –

1

Sie können auch System.Reflection.Emit Namespace verwenden und erstellen Sie eine dynamische, in-Memory-Anordnung.

Alternative ist CodeDom zu verwenden & Kompilierung-Code zu generieren, dann in das nennen.

XMLSerialization() tut Letzteres.

1

können Sie Mono.Cecil verwenden IL zu manipulieren. Es ist ein mächtiges Werkzeug, obwohl es irgendwie Dokumentation fehlt.

Verwandte Themen