Automatische Updates

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.

HelloSparkle

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.

HelloSparkleDiagnostics

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:

HelloSparklePubKey

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:

HelloSparkleWarning

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.

DotNetKicks-DE Image
Dieser Beitrag wurde unter .NET, C#, Updates veröffentlicht. Setze ein Lesezeichen auf den Permalink.

3 Antworten zu Automatische Updates

  1. 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 🙂

  2. Marcel schreibt:

    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?

    • joergpreiss schreibt:

      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.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s