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:
- Wenn ich mehrere Skripte zu kompilieren und wollen entladen müssen sie unabhängig voneinander separate App-Domains erstellen?
- 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?
- 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. - Kann ich
CompilerParameters GenerateInMemory=true
verwenden, oder muss ich es irgendwo speichern?
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? –
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. :) –
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. –