2009-09-22 12 views
10

Ich habe einige C# -Code (nennen wir es "Skript") Ich kompiliere zur Laufzeit. Es benutzt eine Schnittstelle in meinem Hauptprogramm, mit der ich auf seine Funktionen zugreife. Sobald kompiliert ist, habe ich CompilerResults.CompiledAssembly in diesem Fall kann ich CreateInstance(Type).Entladen CodeDom-kompilierte Assembly

Sobald ich fertig bin mit dem Skript möchte ich vollständig entladen. Von dem, was ich verstehe, kann ich dies nur tun, wenn ich eine separate Anwendungsdomäne zu erstellen: Loading DLLs into a separate AppDomain

hatte ich einige Fragen speziell für meine Implementierung:

  1. Wenn ich mehrere Skripte zu kompilieren und wollen entladen müssen sie unabhängig voneinander separate App-Domains erstellen?
  2. Welche App-Domänennamen sollte ich verwenden? Würden GUIDs eine gute Idee sein? Gibt es irgendwelche Namen, die ich vermeiden sollte, die Konflikte verursachen könnten?
  3. Wenn sich die Assembly in einer separaten App-Domäne befindet, treten Probleme beim Zugriff auf die Schnittstelle im Hauptprogramm auf? Ich mache gerade ReferencedAssemblies.Add(typeof(Interface).Assembly.Location), bevor ich kompiliere.
  4. Kann ich CompilerParameters GenerateInMemory=true verwenden, oder muss ich es irgendwo speichern?

Antwort

2

Antworten in der Reihenfolge:

  1. Ja, wenn Sie sie benötigen Sie separaten Anwendungsdomänen unabhängig entladen möchten.
  2. Verwenden Sie was auch immer. Es kann Ihnen beim Debuggen helfen, wenn Sie es zurück zum Skript identifizieren können, aber das trifft eher auf den ausführenden Thread zu.
  3. Nicht so lange, wie Sie den Basispfad der Domäneneinrichtung auf Ihren eigenen einstellen.

    AppDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

  4. Nein, Sie müssen es nicht speichern und es klingt nicht so, als würde es Ihnen nützen.

+0

Ich hatte Schwierigkeiten, dies zu arbeiten, also habe ich etwas mehr Forschung. Es sieht so aus, als ob ich etwas mehr Arbeit machen muss, um es zum Laufen zu bringen: http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load -und-Entlade-Code /. Es sei denn, es gibt etwas Neues in späteren Versionen? –

+0

Sieht aus wie ich Glück habe. Da ich .NET 3.5 verwende, kann ich das Managed Extensibility Framework verwenden. Natürlich muss ich es jetzt lernen. :) –

+1

Sieht so aus, als ob ich tiefer reinkomme, als ich wollte/erwartet habe. MEF kann Assemblys tatsächlich nicht entladen, da keine separate AppDomain verwendet wird. MAF (System.AddIn) kann, ist aber viel komplexer zu verwenden. MAF und MEF können zusammen verwendet werden. Während ich wirklich eine Baugruppe entladen möchte, denke ich, dass dies zumindest für Version 2 warten muss. –