Ermitteln installierter Versionen des .NET Frameworks

Häufig sollen bei der Installation einer Anwendung die Versionsnummern installierter Versionen des .NET Frameworks ermitteln kann. Windows selbst bietet keine Programmierschnittstelle, über die herausgefunden werden kann, welche Versionen des .NET Frameworks auf einem Rechner verfügbar sind. Stattdessen muß man sich die gewünschten Informationen aus der Systemregistrierung, Dateipfaden und Dateiversionen zusammensuchen.

Der Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework besitzt einen Wert mit dem Namen InstallRoot, welcher den Pfad enthält, in dem Versionen des .NET Frameworks installiert sind. Üblicherweise handelt es sich dabei um das Unterverzeichnis Microsoft.NET\Framework des Windows-Verzeichnisses. Außerdem besitzt der Registrierungsschlüssel .NETFramework weitere Unterschlüssel für installierte Versionen des .NET Frameworks; deren Namen besitzen das Format v?.*. Hierbei ist zu bemerken, daß diese Unterschlüssel existieren können, dies aber nicht immer der Fall ist. Die Namen der Schlüssel entsprechen wiederum den Namen der Unterordner des Framework-Installationsverzeichnisses Framework. Zur einfachen Versionsüberprüfung reicht es daher aus, die Namen der Registrierungsschlüssel im Schlüssel .NETFramework und/oder die Namen der Unterverzeichnisse des Verzeichnisses Framework zu ermitteln. Die in den Schlüssel- und Ordnernamen enthaltene Versionsnummer ist jedoch unvollständig, weshalb auf Basis dieser Versionsnummern keine Rückschlüsse auf die installierten Service Packs möglich sind.

Microsoft selbst beschreibt im Artikel How to: Determine which .NET Framework versions are installed“ eine Möglichkeit, an die installierten Service Packs zu gelangen. Jedoch läßt sich auf Basis dieses Dokuments keine allgemeingültige Versionserkennung aufbauen, da je nach Version des .NET Frameworks andere GUIDs und Schlüsselnamen bekannt sein müssen. Für neue Versionen des .NET Frameworks müßte ein derartiges Werkzeug ggf. angepaßt werden.

Seit .NET 1.1 enthält die Bibliothek mscoree.dll die Funktion GetRequestedRuntimeInfo, mit deren Hilfe Informationen zu einer bestimmten Version der CLR erfragt werden können. Diese Funktion ist nicht dazu geeignet, installierte Versionen der CLR bzw. des .NET Frameworks aufzulisten. Falls nur das Vorhandensein einer bestimmten Version der CLR überprüft werden soll, sind die von der Funktion gebotenen Möglichkeiten ausreichend.

Als bislang sicher erwies sich, die vollständige Versionsnummer der Datei mscorwks.dll aus dem jeweiligen Framework-Installationsverzeichnisses zu ermitteln. Die Pfade, in denen sich diese Dateien befinden, lassen sich durch Zusammensetzen des Registrierungswertes InstallRoot mit den Namen der Unterschlüssel von .NETFramework bestimmen. Zusätzlich können dadurch nicht entdeckte Versionen des .NET Frameworks durch Zusammensetzen des Windows-Verzeichnisses mit Microsoft.NET\Framework und darauf folgender Aufzählung passender Unterverzeichnisse gefunden werden. Die auf diesem Wege ermittelten Pfadangaben werden um den Dateinamen mscorwks.dll erweitert. Die Versionsinformationen dieser Dateien geben Aufschluß über Versionen und Service Packs der installierten .NET Frameworks. Bei der Implementierung eines Werkzeugs zum Zwecke der Versionsermittlung ist darauf zu achten, daß dieses nicht selbst das .NET Framework voraussetzt, um auch dann Informationen ermitteln zu können, wenn das .NET Framework nicht auf dem Rechner installiert ist.

Frank Dzaebel stellt in seinem Artikel Determine the Servicepack of .NET Framework die Stapelverarbeitungsdatei NetVersion.bat vor, die durch Analyse der Unterverzeichnisse von %WINDIR%\Microsoft.NET\Framework bestehende Installationen des .NET Frameworks ausfindig macht. Falls das .NET Framework gefunden wird, erstellt die Stapelverarbeitungsdatei durch Aufruf des im .NET Framework enthaltenen C#-Compilers csc.exe ein Befehlszeilenprogramm, das mittels der Klasse FileVersionInfo die Dateiversion aller gefundenen mscorwks.dll-Dateien bestimmt. Nachteilig an dieser Vorgehensweise ist, daß die Systemregistrierung nicht durchsucht wird.

Das in diesem Artikel vorgestellte Werkzeug dnchk sucht sowohl die in der Systemregistrierung als auch im Dateisystem nach installierten Versionen des .NET Frameworks. Damit das Werkzeug auch dann ausgeführt werden kann, wenn kein funktionsfähiges .NET Framework installiert ist, wurde es in C++ entwickelt. Das Projekt ist sowohl für ANSI-, als auch für Unicode-Systeme kompilierbar. Versionsinformationen zu gefundenen mscorwks.dll-Dateien werden auf der Standardausgabe ausgegeben. Das Programm befindet sich in einem experimentellen Zustand und wurde nicht ausgiebig getestet. Eine umfangreichere, wiederverwendbare Bibliothek wurde von Nishant Sivakumar im Artikel The coding gentleman’s guide to detecting the .NET Framework veröffentlicht.

Downloads

Beispielprojekt (dnchk.zip)

Projekt im Visual-C++-2005-Format.

Hinweise zum Erstellen des Projektes mit MinGW

Beim Linken des Projektes mit MinGW muß darauf geachtet werden, daß die passenden LIB-Dateien dem Linker übergeben werden. Benötigt das Visual-C++-Projekt die Datei version.lib, muß stattdessen unter MinGW die Datei libversion.a angegeben werden. Dank gilt Ulf Kadner für diesen Hinweis.