Telefon-Nummer +49 (0)7304 / 803 0

BLOG-N-ROLL:
Wissen,
Das Rockt!

Entwickler

2015.03.18

Update einer WPF Anwendung zur Laufzeit
By admin / 18 March / Entwickler / 0 comm.

Aktuell sind wir es gewohnt, dass zum Update einer Anwendung meist ein Neustart notwendig ist. Nachfolgend möchte ich einen Weg aufzeigen, wie man mit Hilfe von MEF auch Komponenten einer Anwendung zur Laufzeit aktualisieren kann. Eine Demo welche auf der nachfolgende Umsetzung bassiert ist auf GitHub zu finden. (https://github.com/artiso-solutions/samples/tree/master/MEFLiveUpdateExample) Das Prinzip Das Grundprinzip ist recht […]

Aktuell sind wir es gewohnt, dass zum Update einer Anwendung meist ein Neustart notwendig ist. Nachfolgend möchte ich einen Weg aufzeigen, wie man mit Hilfe von MEF auch Komponenten einer Anwendung zur Laufzeit aktualisieren kann. Eine Demo welche auf der nachfolgende Umsetzung bassiert ist auf GitHub zu finden. (https://github.com/artiso-solutions/samples/tree/master/MEFLiveUpdateExample)

Das Prinzip

Das Grundprinzip ist recht simpel. Man nehme eine Assembly mit einer der upgedateten Komponente und kopiert sie ins Anwendungsverzeichnis der aktuell laufenden Anwendung. Diese Änderung bekommt die Anwendung mit und aktualisiert den IoC Container, was wiederum dazu führt dass von nun an die neue Komponenten genutzt wird.

Die Umsetzung

Für die Umsetzung sind 3 Dinge notwendig. Zu erst einmal brauchen wir einen Trigger, welcher der Anwendung mitteilt dass diese sich aktualiseren soll. Der Einfachheit halber haben wir uns für einen FileSystemWatcher entschieden welcher uns meldet wenn sich etwas im Ausführungsverzeichnis geändert hat. Wurde der Update einmal getriggert muss die neue Assembly geladen werden. Hierfür nutzen wir MEF und die DirectoryCatalog Klasse. Ändert sich etwas in einem bereits registrierten Directory nutzen wir die Refresh() Methode um den Catalog zu aktualisieren. Kommt ein neues Verzeichnis hinzu, so wird für dieses ein neuer DirectoryCatalog erstellt. Bei unseren ersten Versuchen kam es hierbei zu Fehlern. MEF erkannte zwar das es zwei Assemblies laden muss,  allerdings hatten wir im Container zwei mal die selbe Assembly geladen. Die Lösung war, die Assemblies zu signieren. Hierbei kann der gleiche Key für beide Assemblies verwendet werden. Außerdem muss noch die Assembly Version in der Update Assembly hochgesetzt werden. So wir haben nun das Erkennen eines Updates und das Laden der Assemblies in der Anwendung. Heißt, wir haben nun zwei unterschiedliche Versionen einer Komponente zur Verfügung. Jetzt gilt es noch zu bestimmen welche wir den nun anzeigen sollen. Um zu erkennen, welches die neuere Version ist nutzen wir das ExportMetadata Attribut von MEF. Neben der Versionierung der Assembly, ist es also noch notwendig, dass die Komponente weiß welche Version sie hat. Um dann letztendlich auch in der Anwendung die neue Komponente zu nutzen, werden beim Import die Metadaten ausgewertet und nur die Komponente mit der höchsten Version genutzt. Das war es auch schon. Mehr gibt es im Grunde nicht zu tun.

Aktuelles

Nach oben