17.4 Versionsumleitung in einer Konfigurationsdatei
Kommen wir noch einmal zurück auf das Thema Global Assembly Cache (GAC) aus Abschnitt 17.2. Zur Erinnerung, eine Assembly kann mit dem Tool gacutil.exe in den GAC eingetragen werden. Zur Identifizierung der globalen Assemblierung dient unter anderem auch die Versionsnummer. Auf diese Weise lassen sich auch mehrere gleiche Assemblys, die sich nur in der Versionsnummer unterscheiden, im GAC eintragen. Allerdings wird eine Anwendung immer die globale Assembly aufrufen, die im Manifest eingetragen ist.
Es ist nicht weiter schwierig, die Anwendung dazu zu bewegen, anstatt der ursprünglichen Assembly eine neuere aufzurufen. Dazu muss nur eine entsprechende Versionsumleitung in der Anwendungskonfigurationsdatei definiert werden. Wie eine solche aussehen kann, zeigt das folgende Listing. Um das Prinzip zu verdeutlichen, sei hier als Bezeichner der globalen Assembly GeometricObjects gewählt.
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding
xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="GeometricObjects"
publicKeyToken="3e8e8aeaabe7ee94" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Listing 17.4 Versionsumleitung in der Anwendungskonfigurationsdatei
Maßgeblich sind die beiden Attribute oldVersion und newVersion, die die Versionsumleitung bewirken. Wie reagiert aber die Laufzeitumgebung, wenn unter oldVersion und/oder newVersion Angaben enthalten sind, die nicht den Einträgen im GAC entsprechen?
Die Angabe der alten, zu ersetzenden Komponentenversion spielt zunächst keine Rolle. Existiert die Version nicht, wird die Versionsumleitung ignoriert und die notwendige Bindungsinformation aus dem Manifest bezogen. Etwas sensibler ist die Reaktion, wenn unter newVersion eine Versionsnummer angegeben ist, die im GAC nicht vertreten ist – es kommt zu einem Laufzeitfehler vom Typ FileLoadException. Es gilt die Regel: Verweist das Attribut oldVersion auf eine Komponentenversion, die im GAC registriert ist, muss auch das Attribut newVersion eine bekannte Versionsnummer beinhalten.
Häufig kommt es vor, dass mehrere ältere Versionen durch eine neue ersetzt werden können. Um einer Anwendungskonfigurationsdatei mehr Allgemeingültigkeit mit auf den Weg zu geben, kann man hinter oldVersion einen Versionsbereich festlegen, z. B.:
<bindingRedirect oldVersion="3.0.3.0-3.0.7.0" newVersion="3.0.12.0"/>
Sind auf dem Anwenderrechner mehrere .NET-Anwendungen installiert, die sich der Komponente GeometricObjects bedienen, müssen Sie nicht zu jeder Anwendung eine Anwendungskonfigurationsdatei bereitstellen, um den Aufruf auf die neuere Version zu initiieren. Tragen Sie stattdessen alle mit der Umleitung in Beziehung stehenden XML-Elemente in machine.config ein.
17.4.1 Die Herausgeberrichtliniendatei
Eine Herausgeberrichtliniendatei ist eine Konfigurationsdatei, die vom Komponentenentwickler zu einer Assembly kompiliert und im GAC installiert worden ist. Das Kompilat, die sogenannte Herausgeberrichtlinienassembly, wird zusammen mit einer überarbeiteten globalen Assembly ausgeliefert. Herausgeberrichtliniendateien bieten sich insbesondere dann an, wenn in der älteren Version einer globalen Assembly ein Fehler festgestellt wurde und der Entwickler der globalen Assembly sicherstellen möchte, dass sich alle Anwendungen an die neue Version binden.
Der Inhalt der Herausgeberrichtliniendatei entspricht strukturell dem einer Anwendungskonfigurationsdatei. Der Name der Datei darf beliebig festgelegt werden. Für das Erzeugen der Herausgeberrichtlinienassembly müssen Sie allerdings auf ein Kommandozeilentool zurückgreifen, weil es keinen entsprechenden Assistenten in Visual Studio 2012 gibt. Bei dem Tool handelt es sich um den Assembly Linker al.exe, der im Verzeichnis
\Programme\Microsoft SDKs\Windows\v6.0A\bin
zu finden ist. An der Eingabeaufforderung muss ein verhältnismäßig komplexer Befehl abgesetzt werden, in dem zuerst der Name der Publisherrichtliniendatei, also der XML-Datei, angegeben wird, daran anschließend der Name der resultierenden Herausgeberrichtlinienassembly und zum Schluss auch noch die Schlüsseldatei.
al /link:<Publisherrichtliniendatei> /out:<Ausgabedatei> /keyfile:<SNK-Datei>
Dem Bezeichner der Ausgabedatei, also der Herausgeberrichtlinienassembly, ist besondere Aufmerksamkeit zu widmen, da sie ein besonderes Format aufweisen muss. Er könnte beispielsweise lauten:
policy.1.0.GeometricObjects.dll
Dem Bezeichner ist das Wort policy voranzustellen, dem sich, jeweils durch einen Punkt getrennt, die Versionsnummer der Assembly anschließt, die aus einer Haupt- und einer Nebennummer besteht. Danach wird noch die DLL-Datei der Assemblierung genannt.
Damit könnte der Befehl zur Generierung einer Publisherrichtlinienassembly wie folgt lauten:
al /link:new.config /out:policy.1.0.GeometricObjects.dll /keyfile:MyKey.snk
Eine Bindung an eine neue Assemblyversion im GAC umzuleiten, ist ein gravierender Eingriff auf dem Rechner eines Benutzers. Durch die Angabe der Schlüsseldatei, die natürlich dieselbe sein muss wie diejenige, mit der auch der starke Name der Assembly erzeugt wird, sichert der Entwickler seine Berechtigung für diesen Eingriff zu.
Die Herausgeberrichtlinienassembly muss zusammen mit der Assembly im GAC installiert werden. Dazu können Sie wieder das Tool gacutil mit dem Schalter »/i« benutzen, z. B.:
gacutil /i policy.1.0.ProcessServer.dll
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.