Silverlight-Anwendungen außerhalb des Browsers per Batch, Setup/MSI oder Click-Once verteilen

Der Dotnet-Doktor  –  2 Kommentare

Für Silverlight-Out-Of-Browser-Anwendungen (also Silverlight-Anwendung, die außerhalb des Webbrowser in einem eigenen Fenster ablaufen) sieht man häufig, wie diese per Mausklick des Benutzers aus dem Browser heraus installiert werden. Dabei ist im Unternehmen oft eine Verteilung mit herkömmlichen Methoden wie Batch-Datei/Skript, Setup/MSI oder Click-Once-Deployment auf Windows-Systemen erwünscht. Mit etwas Hintergrundwissen kann man diese Wünsche realisieren.

SLLauncher.exe

Das wichtigste Instrument ist SLLauncher.exe. Das Programm wird mit dem Silverlight-Plug-in unter Windows installiert. Wenn es Benutzer eine Silverlight-Anwendung lokal installiert, entsteht eine Verknüpfung zu dieser Anwendung im Startmenü mit der App-ID der installierten Anwendung als Parameter. SLLaucher ermöglicht aber auch, mit dem Parameter /installer den Installationsvorgang anzustoßen. Dabei bekommt die Silverlight-Anwendung erweiterte Rechte ("Trusted Application"), wenn sie dies anfordert.

Verteilen per Batch-Datei

Das Verteilen per Batch-Datei könnte dann so aussehen:

echo "Kopieren"
copy "x:\Quelle\Silverlight.xap" "c:\temp\silverlight.xap"

echo "Installieren"
"C:\Program Files (x86)\Microsoft Silverlight\sllauncher.exe"
/install:'c:\temp\silverlight.xap'
/origin:"http://www.it-visions.de/demo/ClientBin
/Silverlight.xap" /shortcut:desktop+startmenu
/overwrite

echo "Starten"
"C:\Program Files (x86)\Microsoft Silverlight\sllauncher.exe"
/emulate:"c:\temp\Silverlight.xap"
/origin:"http://www.it-visions.de/demo/ClientBin
/Silverlight.xap" /overwrite

echo "Läuft!"

Diese Schritte kann man in eine Setup-Routine, z.B. eine Custom Action für MSI-Paket, einbauen. Die angegebene URL ist die Adresse für Aktualisierungen.

Verteilen per Click-Once-Deployment

Für eines meiner aktuellen Projekte war die Frage spannend, wie man Silverlight-Anwendung per Click-Once-Deployment verteilen kann. Click-Once-Deployment erfordern zwar auch eine einmalige Installationsaktion des Nutzers, bieten aber den Vorteil, dass dann bei jedem weiteren Start die Anwendung automatisch aktualisiert wird. Nun bietet zwar Silverlight auch einen eigenen Aktualisierungsmechanismus, dieser funktioniert aber ohne Benutzereingriff nur bei Silverlight-Anwendungen, die aus dem Browser gestartet werden. Bei Out-Of-Browser-Anwendungen ist für die Aktualisierung notwendig, dass diese schon läuft und dann vom Benutzer neu gestartet wird. Es ist durchaus lästig für den Benutzer, wenn er nach dem Start die Meldung sieht: "Eine Aktualisierung wurde heruntergeladen, bitte starten Sie die Anwendung neu." Eine automatische Aktualisierung beim Start der Anwendung ohne Benutzereingriff ist von Microsoft bisher leider nicht vorgesehen. Genau das aber bietet Click-Once.

Vorweg muss man festhalten: Click-Once-Deployment ist nur nutzbar, wenn auf dem Client ein vollständiges .NET-Framework (ab Version 2.0) oder zumindest ein .NET-Client-Profil (ab Version 3.5 SP1) vorhanden ist. Administrator-Rechte sind aber für die Installation der Silverlight-Anwendung per Click-Once dann ebenso wenig wie bei der Standard-Lösung aus dem Browser notwendig.

Da man nicht sllauncher.exe direkt in dem Click-Once-Prozess aufrufen kann, erstellt man einfach ein kleines Vorprogramm, das die notwendigen Schritte mit sllauncher.exe ausführt:

string dir = 
Path.GetDirectoryName(Process.GetCurrentProcess()
.MainModule.FileName);
string exe = Path.Combine(dir, "sllauncher.exe");
string xap = Path.Combine(dir, "Silverlight.xap");
string url = @"http://www.IT-Visions.de/demo";

// 1. Schritt: Installation
ProcessStartInfo psi1 = new ProcessStartInfo();
psi1.FileName = exe;
psi1.Arguments = String.Format(" /install:\"{0}\" /origin:
\"{1}\" /shortcut:desktop+startmenu /overwrite", xap, url);
Process p = Process.Start(psi1);
// Warten, bis Installation abgeschlossen
p.WaitForExit();

// 2. Schritt: Start der Silverlight-Anwendung
ProcessStartInfo psi2 = new ProcessStartInfo();
psi2.FileName = exe;
psi2.Arguments = String.Format(" /emulate:\"{0}\" /origin:
\"{1}\" /overwrite", xap, url);
Process.Start(psi2);

Dann muss man nur noch in das Projekt die sllaucher.exe und die Silverlight.xap-Datei einbinden (als "Content/Copy if newer"), sodass sie mit im Click-Once-Verzeichnis laden.

Click-Once-Installation einer Silverlight-Anwendung

Noch zwei Tricks:

  1. Wenn man die Silverlight.xap in das Visual Studio-Click-Once-Projekt nicht statisch einbindet, sondern als Link, dann aktualisiert sich bei jedem Kompilieren die .xap-Datei automatisch.
  2. Man kann das Click-Once-Projekt nicht nur zum Verteilen der Anwendung, sondern alternativ auch wunderbar zum Debugging einsetzen. Normalerweise müsste man eine Out-Of-Browser-Anwendung nach jedem Neukompilieren in Visual Studio immer händisch aktualisieren wie oben beschrieben . Wenn man nun dieses Click-Once-Vorprogramm statt einer Webseite zum Startprogramm für den Visual Studio-Debugger macht, dann startet beim Debugging immer die aktuelle Version – ganz ohne lästiges Klicken.

Zum Download des Silverlight-Geschäftsanwendungsbeispiels mit Click-Once-Deployment.