Windows Installer und die Tabellen ServiceInstall und ServiceControl

Das Installationsprogramm von VCR.NET ist mit dem WiX Toolset 3.8 entwickelt, das letztlich Windows Installer Tabellen erstellt – auf einer insgesamt sehr eingängigen Philosophie. Zum Feintuning des Windows Dienstes VCR.NET Recording Service habe ich bisher Custom Actions verwendet und mir aber nun zum Ziel gesetzt, möglichst viel Standardfunktionalitäten des Windows Installers zu nutzen. Das hat zwar hier funktioniert, aber nur mit Haken und Ösen und nicht übertragbar auf größere Projekte. Trotzdem ein kleiner Erfahrungsbericht.

Die Installation des Dienstes erfolgt über die ServiceInstall Tabelle des Windows Installers – mit Hilfe des WiX Elementes ServiceInstall. An sich sehr einfach, einsichtig und elegant bis zu der Tatsache, dass die StartType Spalte eine Zahl ist und nicht dynamisch durch Properties des Installationsvorgangs berechnet werden kann. Ich möchte aber gerne dem Anwender die Möglichkeit geben, den Dienst auch mit manuellem Start (Vorgabe ist automatischer Start) zu installieren – etwa, wenn man sich nur den Quellcode anschauen möchte und nicht plötzlich nach dem nächsten Booten irgend einen Windows Dienst laufen haben will. Die scheinbar offizielle Lösung ist, für beide Varianten eigene Installer Komponenten mit unterschiedlichen Bedingungen zu hinterlegen. Zwar meckert dann die MSI Validierung (ICE30), was aber hier eine kontrollierte Warnung ist. Viel lästiger ist natürlich, dass man in der Tat eine doppelte Konfiguration hinterlegen muss – schade und fehleranfällig.

Auch wenn man das erst einmal als notwendiges Übel akzeptiert kommt direkt der nächste Rückschlag: auch in der ServiceControl Tabelle ist die Spalte Event wieder eine Konstante und nicht dynamisch während der Installation berechenbar ist. Ich möchte aber in der VCR.NET Installation auch erlauben, dass der Windows Dienst nach der Installation nicht automatisch gestartet wird. Natürlich kann man auch hier wieder den Weg mit den bedingten Komponenten gehen, dann sind es aber schon vier Kopien von quasi identischem Code.

Ich bin daher hier einen etwas anderen Weg gegangen: in der Installationssequenz wird die StartServices Aktion nur ausgeführt, wenn der Anwender dies auch tatsächlich wünscht. So kann in den Komponenten zum Dienst immer ein Startwunsch geäußert werden, der dann aber eventuell einfach nicht umgesetzt wird. Würde die Installation mehrere Dienste beinhalten und würde man grundsätzlich nur entscheiden, ob alle Dienste entweder gestartet werden oder halt nicht, so ist diese Lösung sicher tragbar.

Allerdings ist das auch der Knackpunkt. Eine Installation mit mehreren Diensten und individuellen Auswahlmöglichkeiten beider Optionen erzeugt eine ganze Menge Copy & Paste in der Installationsbeschreibung – egal, ob mit WiX erstellt oder anderweitig. Das wäre für mich dann schon der Punkt, an dem man über eine Custom Action nachdenken sollte. Im Nachhinein frage ich mich nur, nach welchen Kriterien wirklich entschieden wurde, ob eine Spalte einer Windows Installer Tabelle statisch oder dynamisch ist. Oft ist klar, dass potentiell mehrsprachige Spalten wie Anzeigename oder Beschreibung berechenbar sind. Die ganze Infrastruktur des Windows Installers wäre aber vermutlich viel mächtiger und vielseitiger, wenn alle Spalten dynamisch verfügbar wären. Aber da ist wohl nicht mehr dran zu rütteln…

So long

Jochen

VCR.NET 4.3: Aufgaben im Aufzeichnungsplan

Manchmal sind es einfach die kleinen Dinge, die nerven. So gab es im Aufzeichnungsplan zwei Schalter, um die Aufgaben für die Aktualisierung von Programmzeitschrift und Quellen (aka Sendersuchlauf) in den Plan einzublenden. Gerade die Beschriftung „Programmzeitschrift“ führte selbst bei mir dazu, dass ich diesen Schalter betätigt habe, wenn ich eigentlich eine neue Aufzeichnung anlegen wollte. In VCR.NET 4.3 gibt es nun einen Schalter für beide Arten von periodischen Hintergrundaufgaben, der zudem deutlich anders beschriftet ist. Ich hoffe, das hilft zumindest mir 🙂

Aufgaben im Aufzeichnungsplan

Wie immer viel Spaß

Jochen

VCR.NET 4.3: Aktuelle Uhrzeit in laufender Aufzeichnung

Bei einer laufenden Aufzeichnung wird in die Überlappanzeige von programmierter Zeit und Senderzeit aus der Programmzeitschrift nun ein kleiner Balken eingeblendet, der die aktuelle Uhrzeit repräsentiert. Somit erhält man einen schnellen Überblick über den Stand der Aufzeichnung – auch wenn man den Programmzeitschriften nicht wirklich glauben sollte.

Aktuelle Uhrzeit

Viel Spaß

Jochen

VCR.NET Issue Tracking in GitHub

Ich habe mal angefangen meine privaten ToDo Listen für DVB.NET und VCR.NET als Issues auf GitHub einzustellen – es besteht aber kein Anspruch auf Vollständigkeit!

Die Vergangenheit und vor allem der Anfang dieses Jahres hat gezeigt, dass eine Zeitplanung für meine privaten Projekte kaum möglich ist – dieses Jahr bisher vor allem beruflich bedingt, es sind aber noch private Dinge offen. Daher macht das Erstellen der Liste an sich auch keine Aussage darüber, was wirklich in die nächste Version (im Moment VCR.NET 4.3) aufgenommen wird. Allerdings habe ich schon mal mutig die Punkte dem Milestone 4.3 zugeordnet, die ich mir (in diesem Sinne) fest vorgenommen habe.

Zum Glück ist im Moment kein echter Show-Stopper bekannt, darum gehe ich das auch etwas ruhiger an.

Vielleich so als einfache Übersicht für alle Anwender

Jochen

ASP.NET Anwendungen über VCR.NET 4.3 anbieten

Der VCR.NET Recording Service hat einen auf der ASP.NET 4.5.1 Laufzeitumgebung basierenden integrierten Web Server, über den REST Dienste und der primäre Web Client angeboten werden – üblicherweise verfügbar über http://localhost/VCR.NET/default.html. Neu mit der Version 4.3 ist, dass nun weitere virtuelle Verzeichnisse über VCR.NET verfügbar gemacht werden können. Ähnlich wie im Internet Information Service bekommt jedes virtuelle Verzeichnis eine eigene .NET AppDomain zugeordnet, so dass eine gewisse Isolierung gegenüber den eigentlichen Aufgaben von VCR.NET garantiert ist. Natürlich ist diese Möglichkeit mit Bedacht einzusetzen, um den Kernbetrieb des VCR.NET Recording Service nicht zu gefährden und vor allem die Betriebsstabilität zu garantieren.

Beim Starten prüft VCR.NET 4.3ff, ob ein Unterverzeichnis Apps im Installationsverzeichnis existiert. Für jedes Unterverzeichnis darin wird ein gleichnamiges virtuelles Verzeichnis erstellt – diese darf natürlich namentlich nicht mit virtuellen Verzeichnissen anderer Web Server auf dem selben Rechner kollidieren, vor allem nicht mit denen des lokalen IIS. Existiert etwa ein Unterverzeichnis MediaDb, so kann nach dieses nach dem Starten vom VCR.NET als http://localhost/MediaDb/… verwendet werden.

Im Vorfeld hat sich zwar gezeigt, dass die ASP.NET Laufzeitumgebung innerhalb von VCR.NET kein vollwertiger Ersatz für einen IIS ist, aber zumindest habe ich für mich so eine sehr einfach und installationsarme Möglichkeit gefunden, Web Anwendungen anzubieten. Vielleicht hat sich ja der eine oder andere VCR.NET Anwender so etwas auch schon mal gewünscht, wer weiß.

Jochen