Ein häufig wiederkehrendes Thema heutzutage: manchmal geht es bei der .NET Installation oder Upgrade schief. Ich wollte hier eine kurz gefasst ein paar Hinweise zu .NET Installer, Probleme und Möglichkeiten, diese zu analysieren und beseitigen.

1. Das .NET Modell

Mit .NET Framework hat man ein ständig komplexer geworden Softwaresystem, welches - in verschiedenen Versionen! - auf verschiedenen Betriebssystemen und Umgebungen funktions- und wartungsfähig sein soll. Demenstprechend ist auch der Installer ziemlich komplex aufgebaut. Grundsätzlich gibt es heute folgende .NET Versionen:

  • .NET 1.x (1.0, 1.1) - die ersten Versionen des Frameworks (CLR 1.x)
  • .NET 2.0 - eine neue, eigenständige, von 1.x unabhängige(*) Version, mit einem neuen Common Language Runtime (CLR 2.0). Kann zusammen mit .NET 1.x auf demselben Rechner vorhanden sein (side-by-side)
  • .NET 3.0 = .NET 2.0 + auf .NET CLR 2.0 basierende .NET 3.0 Komponenten
  • .NET 3.5 = .NET 3.0 + auf .NET CLR 2.0 basierende .NET 3.5 Komponenten
  • .NET 4.0 - eine neues, eigenständiges Release (CLR 4.0 !). Kann zusammen mit .NET 2.0, 1.x auf demselben Rechner vorhanden sein (side-by-side)

Diese Versionen können entweder vom Benutzer/Admin installiert werden oder in bestimmten Fällen gleich mit dem Betriebssystem vorinstalliert kommen - das spielt bei der Wartung/Installationsprobleme eine wichtige Rolle, denn es sind als Betriebssystemteile betrachtet:

  • Windows 7 kommt mit .NET 3.5 SP1 
  • Windows Server 2008 kommt mit .NET 3.0 SP1 
  • Windows Vista kommt mit .NET 3.0 (Vista SP1 mit .NET 3.0 SP1)
  • Windows Server 2003 kommt mit .NET 1.1
  • Windows XP Media Center Edition or Tablet PC Edition kommen mit .NET 1.0

Es ist wichtig zu verstehen, dass .NET 3.0 und 3.5 immer zusammen mit .NET 2.0 kommen (.NET 2.0 CLR). Es gibt folgende Service Packs für .NET 2.0-basierende Framework-Versionen:

  • .NET 2.0 SP1, .NET 2.0 SP2 (falls nur .NET 2.0 installiert ist) 
  • .NET 3.0 SP1 (mit .NET 2.0 SP1)
  • .NET 3.5 = .NET 2.0 SP1 + .NET 3.0 SP1  (+.NET 3.5 Komponenten)
  • .NET 3.5 SP1 = .NET 2.0 SP2 + .NET 3.0 SP2  (+.NET 3.5 SP1 Komponenten)
  • .NET 3.5 Family Update für SP1 = wichtige Cumulative Updates zu .NET 3.5 SP1 (also keine neue SPs, aber ausdrücklich für SP1 empfohlen !)

Es wird klar, dass die 3.0 und 3.5 Upgrades immer kumulativ sind, d.h., beinhalten auch SPs für die "eingeschlossenen" Framework-Komponenten (das macht auch Sinn, denn sonst würden die überarbeiteten Komponenten in der alten Umgebung laufen). Für .NET 2.0 gibt es ein separates Download für SP2, während .NET 3.0 SP2 nur als Teil von .NET 3.5 SP1 erhältich ist.

Generell gilt bei  Service Packs: man muss immer den SP Installer wählen, welcher zumindest alle .NET Versionen auf einem bestimten Rechner deckt. Zum Beispiel:

  • hat man nur .NET 2.0, dann kann  man .NET 2.0 SPx verwenden (oder aber eine 3.x Version darüber installieren, wenn gewünscht)
  • hat man 3.x, so muss manden enstprechende 3.x SPx verwenden (es ist keine gute idee in einer 3.x Installation nur die 2.0 SPs zu installieren)
  • Generell empfehlen wir stark, die .NET 3.5 (in der 3.5 Family Update aktuellen Version!) zu insatellieren und verwenden

Und wie steht es mit .NET 1.x ? Die SPs und Patches für 1.x sind unabhängig von den oben aufgelisteten, da 1.x side-by-side mit 2.0 funktioniert. Die einzige - aber wichige - Berührungsstelle werde ich bei dem Troubleshooting von .NET Installation erwähnen.

Ähnlich wird es mit .NET 4.0 sein: dies ist ein side-by-side, eigenständiges Release und setzt nicht 3.x oder 2.x oder 1.x voraus.

2. Wenn es schief geht..

Ich werde demnächst über Probleme bei der Instalation/Upgrade von verschiedenen .NET Versionen sprechen. Manchmal lässt sich ein Service Pack - oder gar eine Neuinstallation ! - nicht installieren, auch wenn man vorher sogar alle .NET Versionen deinstalliert (manchmal geht sogar die Deinstallation nicht). Das kann sehr viele Gründe haben, der häufigste und zugleich am schwierigsten zu fixen ist: die auf dem Rechner vorhandene .NET Installation ist korrupt (Registry, Dateisystem, Windows Installer Cache). Das kann beispielsweise durch andere Softwareinstallationen geschehen.

Der Prozess, eine fehlgeschlagene .NET Installation zu untersuchen und zu fixen sieht so aus:

  • Ein Neustart der Machine kann manchmal helfen (in bestimmten Fällen braucht .NET INstaller einfach einen Neustart, um Dateien ersetzen zu können welche zum Zeitpunkt der Installation von aderen Programmen gebraucht ,und somit blockiert, waren)
  • Besteht das gleiche Problem/Fehlermeldung immer noch und finden man daraus keinen Ausweg, so sollte man die Installationslogs analysieren - das ist übrigens meistens der erste Schritt wenn man bei Microsoft Support um Hilfe fragt.
    • Die Logs werden defaultmässig im %temp% - Verzeichnis erstellt. Am einfachsten kann man dieses Verzeichnis leeren und anschliessend die Installation nochmal starten: dann bekommt man mehere Log-Dateien (s.http://blogs.msdn.com/astebner/articles/447012.aspx)
    • Man sollte auch das Windows Installer detailiierte (verbose) Logging aktivieren: http://support.microsoft.com/kb/223300
      • HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer
        Reg_SZ: Logging
        Wert: voicewarmup
    • Die Analyze der Logs - und besonders von MSI Logs (Windows Installer) ist ein komplexes Thema und kann nicht hier abgedeckt werden. Trotzem: man sucht generell zuerst in den .NET logs (dd_netfx20UI****.txt , s. http://blogs.msdn.com/astebner/articles/447012.aspx) nach Fehlern. Anschliessend sucht man in den detailiierten MSI Logs (MSI***.*) um mehr über den Fehler zu erfahren.

Meistens findet man einen Anhaltspunkt in den Logs und manchmal kann man daraus auch eine Lösung ableiten. Es gibt aber Fälle, wo das eben nicht gelingt: auch wenn man das problem erkennt, kann man es nicht beseitigen. In solche Situationen hilf nur eine Neuinstallation - und zwar nach einem Cleanup ! Dafür gibt es das .NET Cleanup Tool von Aaron Stebner: http://blogs.msdn.com/astebner/archive/2006/05/30/611355.aspx. Das tool automatisiert eine Reihe von manuellen Schritten (http://blogs.msdn.com/astebner/archive/2005/04/16/408856.aspx) um letzendlich die verschiedenen .NET Registry-Einträge, GAC, WIndows installer usw. zu löschen und somit den Rechner in einem sauberen Zustand zu haben. Wichtige Hinweise bei der Verwendung des Tools:

  • Man kann mit dem Tool slektiv die verschiedenen .NET Versionen entfernen: 1.0, 1.1, 2.0. 3.0, 3.5 - oder auch alle Versionen
  • Allerdings muss man beachten, dass die Entfernung einer 2.0-basierende Version die .NET 1.x unbrauchbar macht: der Grund ist die Entfernung von mscoree.dll welche von allen .NET Versionen gemeinsam verwendet wird. Man muss anschliessend entweder ein Repair von 1.x durchführen oder eine 2.0 basierte .NET Version installieren. Mehr auf Aaron Stebner's blog: http://blogs.msdn.com/astebner/archive/2005/04/16/408856.aspx
  • Daraus ergibt sich in der Praxis, dass man am sichersten gleich alle .NET Versionen entfernt und anschliessend neu installiert (von 1.x -> 3.x)
  • Das Tool funktioniert nicht für den im Betriebssystem eingebauten .NET Versionen: für diese muss man in der Regel ein Betriebssystem-Repair durchführen.
  • Das Tool ist nur für den Fall gedacht, wo eine normale Deinstallation (über Add/Remove Software) nicht das gewünschte Ergebnis bringt

Ein weiteres Tool von Nutzen ist das .NET Verification Tool: http://blogs.msdn.com/astebner/pages/8999004.aspx. Damit kann man bequem prüfen, welche .NET Versionen auf einem Rechner vorhanden sind. Darüber hinaus führt das Tool auch eine kleine Testanwedung, wo man sehen kann, ob die als installiert gemeldete .NET Version auch tatsächlich richtig funktioniert.