Prolog
Gewünscht wäre ein automatisches Update-System à la Debian apt. Nun ist nuget schon ein Schritt in die richtige Richtung, allerdings mit seiner Visual-Studio-Integration mehr für Entwickler gedacht. An dieser Stelle kommt NetSparkle ins Spiel. Laut Beschreibung stellt es einen automatischen Update-Mechanismus für einzelne Programme zur Verfügung.
Erster Anlauf
Nach dem Erstellen einer simplen Forms-Anwendung und dem Hinzufügen einer Referenz auf AppLimit.NetSparkle.Net40 muss der Update-Mechanismus initialisiert werden. Hierfür genügen laut Dokumentation die Zeilen
public partial class MainForm : Form { private Sparkle _sparkle; public MainForm() { InitializeComponent(); _sparkle = new Sparkle("http://www.slesa.de/download/updates/HelloSparkle/versioninfo.xml"); _sparkle.StartLoop(true); } }
Ein erster Probelauf im Debugger offenbart, dass noch die Company-Information fehlt. Bei der Gelegenheit kann auch gerade die Versionsnummer in der AssemblyInfo.cs angepasst werden. Für einen ersten Anlauf erscheint Version 1.0.0 zu hoch gegriffen:
[assembly: AssemblyCompany("Slesa Inc.")] [assembly: AssemblyVersion("0.0.1.0")] [assembly: AssemblyFileVersion("0.0.1.0")]
Startet man die Applikation erneut, läuft sie und tut offenbar nichts. Dabei pollt sie im Hintergrund bereits auf eine Versionsinfo, die auf eine neue Version hindeutet. Legen wir also die versioninfo.xml an
<?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>HelloSparkle Update</title> <link>http://www.slesa.de/download/updates/HelloSparkle/versioninfo.xml</link> <description></description> <language>en</language> <item> <title>Version 1.0.1</title> <sparkle:releaseNotesLink>http://update.applimit.com/netsparkle/1.0.1/rnotes.html</sparkle:releaseNotesLink> <pubDate>Sun, 31 Oct 2010 10:21:11 +0000</pubDate> <enclosure url="http://update.applimit.com/netsparkle/1.0.1/NetSparklTestApp-1.0.1.exe" length="5120" type="application/octet-stream" sparkle:version="1.0.1" sparkle:dsaSignature="ngnGYS1ELmGWlhWp0FAzwjmc8VdAFkyIuoybSUwPkpmt+HusArTINQ==" /> </item> </channel> </rss>
und kopieren die Datei auf unseren Server. Jetzt sollte ein Fenster erscheinen, in dem auf die neue Version hingewiesen wird.
Fehlersuche
Nach dem Beenden und erneuten Starts des Programms erscheint kein weiterer Hinweis. NetSparkle scheint, kaum gelaufen, schon kaputt zu sein. Wir lassen uns mal ein Diagnose-Fenster anzeigen:
_sparkle = new Sparkl("http://www.slesa.de/download/updates/HelloSparkle/versioninfo.xml"); _sparkle.ShowDiagnosticWindow = true; _sparkle.StartLoop(true);
Wichtig ist, ShowDiagnosticWindow vor dem Start des Loops zu setzen.
Schon sehen wir, warum keine weiteren Fenster erscheinen: Update check performed within the last 24 hours! Ein kurzes Stöbern in der Registry offenbart: NetSparkle hat einen Schlüssel
HKEY_CURRENT_USER\Software\Slesa Inc.\HelloSparkle\AutoUpdate
angelegt, unter dem die Daten des Software-Updates gespeichert werden. Nach dem Löschen des Eintrags LastTimeCheck wird erneut auf ein Update geprüft.
Sicherheit
Da NetSparkle Programme aus dem Internet herunterlädt und diese auf dem lokalen Rechner ausführt, sollte man die Update-Pakete absichern. Hierfür wird mit den mitgelieferten Tools zuerst ein Schlüsselpaar generiert:
NetSparkleDSAHelper.exe /genkey_pair
erzeugt die Dateien NetSparkle_DSA.priv und NetSparkle_DSA.pub. Letztere – der öffentliche Schlüssel – wird dem Projekt hinzugefügt und als Embedded Resource markiert:
Nach erneutem Starten (nachdem man wiederum den Registry-Schlüssel gelöscht hat) erscheint nun ein Hinweis, dass mit dem Update-Paket nicht alles so ist wie es sein sollte:
Um diese Warnung zu umgehen, muss das Paket signiert werden, und zwar mit dem privaten Schlüssel, den wir gerade erzeugt haben:
NetSparkleDSAHelper.exe /sign_update [YourUpdate.Exe] NetSparkle_DSA.priv
Fazit
Mit wenigen Handgriffen hat man seine Applikation auf Versionsupdates vorbereitet. Durch Anpassen der Links innerhalb der versioninfo.xml kann man eigene Release-Notes anzeigen lassen, und natürlich sollte man auf das eigene Update-Programm verweisen. Spannend erscheint jetzt noch die Frage, ob das Erzeugen von entsprechenden Updatern mit Hilfe von WiX gelingt, oder ob es da weitere Hürden zu umschiffen gilt.
Thanks for this article, I just translated it.
I found that the documentation provided with net sparkle was very limited..
Anyways I think following you guide I should be able to implement this in my own app 🙂
Hallo
Funktioniert dies auch mit z.B. Windows 7 mit aktiviertem UAC? Nur mit Administratorenrechte kann normalerweise in das Programmverzeichnis geschrieben werden. Wie löst dies NetSparkle?
Sorry, das dauerte länger. Wenn ich mich recht entsinne, fordert NetSparkle höhere Rechte an. Ich selbst hab UAC immer aktiviert, ich möchte wissen, was sich bei mir einnisten will.