Kann Eine .NET-Anwendung eine versionierte ManagedCode dll. Komponente, die aktuell geladen ist aktualisieren ?
Vorstellung: - Die Anwendung entlädt die .dll manuell (geht das überhaupt ?) - Die dll-Datei wird durch eine aktuellere Komponente im Programmordner ersetzt - aktualisierte dll wird bei nächster Verwendung wieder geladen
eine Dll zu wieder entladen ist meines Wissens nicht möglich. Was man entladen kann, sind AppDomains. Eine Möglichkeit wäre also, die Dlls, die Du potentiell entladen willst, in eigenen AppDomains zu hosten. Der einzige "Nachteil" ist, dass Du nun eine Cross-AppDomain-Kommunikation für die Komponenten in den eigenen AppDomains aufbauen musst. Dafür hast Du mehrere Möglichkeiten:
Wenn Du das Ganze mit einer der oben genannten Möglichkeiten umgestellt hast, dann eröffnen sich auch andere Möglichkeiten der Verteilung deiner Komponenten, z.B. eigener Prozess, Windows Service, Server, ... (nur so vielleicht zum Weiterdenken...)
Wenn ich die Frage richtig verstanden habe ist ein Neustart der Applikation nicht erwünscht. Für ein Assembly Binding Redirect braucht man zwar keinen Recompile, aber die Applikation muss mit der angepassten Konfiguration neu gestartet werden, d.h. es wird nicht nur die Dll entladen, sondern mit ihr die gesamte Anwendung. Mit MEF kenn ich mich nicht aus, habe aber auch meine Zweifel, dass es Assemblies zur Laufzeit entladen kann (weil es ohne Vorkehrungen einfach nicht geht).
Ich habe eine Diskussion gefunden, die darauf hindeutet, dass auch MEF dazu nicht ohne weiteres in der Lage ist (http://stackoverflow.com/questions/5395817/how-to-remove-mef-plugins-at-runtime)
Ayende hat mal einen tollen Artikel/ScreenCast zu dem Thema gemacht: Hot Code Swapping. Dort beschreibt er (ich meine auch mit Code-Beispiel) sehr gut wie das gehen könnte (unter Verwendung von MarshalByRefObject). Schaue es dir an, ist wohl genau das was du machen willst.
Für ein Assembly Binding Redirect braucht man zwar keinen Recompile, aber die Applikation muss mit der angepassten Konfiguration neu gestartet werden, d.h. es wird nicht nur die Dll entladen, sondern mit ihr die gesamte Anwendung.
Mit MEF kenn ich mich nicht aus, habe aber auch meine Zweifel, dass es Assemblies zur Laufzeit entladen kann (weil es ohne Vorkehrungen einfach nicht geht).