## 15.4 Versionsumleitung in einer Konfigurationsdatei Kommen wir zurück zu unserer Klassenbibliothek GeometricObjects. Zuletzt hatten wir diese als globale Assembly im Global Assembly Cache (GAC) eingetragen. Darüber hinaus hatten wir auch die Version 2.0.0.0 von GeometricObjects erstellt und mit einer Setup-Routine im GAC registriert. Die Testanwendung TestApplication, die mit Version 1.0.0.0 kompiliert und installiert worden ist, benutzt immer noch die ursprüngliche erste Version und kann noch nicht von der neueren profitieren. Angedeutet hatte ich zum Ende von Abschnitt 15.2.4, bereits, dass wir über eine Konfigurationsdatei erreichen können, dass TestApplication nicht mehr Version 1.0.0.0 aufruft, sondern die Version 2.0.0.0. Jetzt, nachdem Sie die Konfigurationsdateien kennengelernt haben, ist der Zeitpunkt gekommen, Ihnen das zu zeigen. Natürlich können Sie die Anwendungskonfigurationsdatei mit allen notwendigen Einträgen manuell anlegen bzw. eine vorhandene ergänzen. Es geht aber einfacher über ein administratives Konfigurationstool, dessen Bedienung ich Ihnen nun Schritt für Schritt zeige. Öffnen Sie über die Systemsteuerung den Dialog Verwaltung, und doppelklicken Sie darin auf Microsoft .NET Framework 2.0-Konfiguration. In dem Fenster, das daraufhin angezeigt wird, öffnen Sie den Knoten Arbeitsplatz. Markieren Sie hier den untersten Listenpunkt, Anwendungen. Im rechten Teilbereich sehen Sie danach den Link Zu konfigurierende Anwendung hinzufügen (siehe Abbildung 15.16). Hier klicken, um das Bild zu vergrößern Abbildung 15.16 Das .NET-Konfigurationstool Wenn Sie auf den Link klicken, können Sie in einem weiteren Fenster die Anwendung suchen, die Sie konfigurieren möchten. In unserem Fall ist es die Anwendung TestApplication.exe. Diese wird nun dem Knoten Anwendungen des Konfigurationstools hinzugefügt, während im rechten Bereich mehrere Links angeboten werden (siehe Abbildung 15.17). Hier klicken, um das Bild zu vergrößern Abbildung 15.17 Die zu konfigurierende Anwendung »TestApplication« Klicken Sie auf Verwaltete konfigurierte Assemblys. Die Ansicht des rechten Fensterbereichs bietet Ihnen daraufhin mit Liste der konfigurierten Assemblys anzeigen und Assembly konfigurieren zwei Auswahlmöglichkeiten (siehe Abbildung 15.18). Sie müssen sich für letztgenannte entscheiden. Hier klicken, um das Bild zu vergrößern Abbildung 15.18 Konfigurierte Assemblys einer Anwendung Geben Sie im Dialog Eine Assembly konfigurieren nun die entsprechende Assembly an. Da unser Ziel eine Versionsumleitung ist, müssen Sie GeometricObjects ausgehend vom in Abbildung 15.19 gezeigten Dialog suchen. Es wird Ihnen dabei eine Liste des GAC angezeigt, in der GeometricObjects zweimal vertreten ist (in den Versionen 1.0.0.0 und 2.0.0.0). Welche Sie auswählen, spielt im Zusammenhang mit unserer Zielsetzung keine Rolle. Dass Sie im oberen Bereich der deutschen Version des Konfigurationstools einen schwarzen Bereich sehen … na ja, auch Microsofts Entwicklerteam ist bekanntlich nicht ganz unfehlbar. Hier klicken, um das Bild zu vergrößern Abbildung 15.19 Der Eintrag der zu konfigurierenden Assembly Nachdem Sie die zu konfigurierende Assembly GeometricObjects bekannt gegeben haben und im Dialog auf Fertig stellen geklickt haben, wird ein neues Fenster geöffnet, wie in Abbildung 15.20 gezeigt. Hier aktivieren Sie den Karteireiter Bindungsrichtlinie. Der Moment ist gekommen, um nun endlich die aufzurufende Version der Assembly GeometricObjects für die Anwendung TestApplication festzulegen. Nehmen Sie die Einträge wie in Abbildung 15.21 vor, und schließen Sie dann das Konfigurationstool. Hier klicken, um das Bild zu vergrößern Abbildung 15.20 Das Fenster, um die globale Assembly zu konfigurieren Hier klicken, um das Bild zu vergrößern Abbildung 15.21 Angabe der neuen Assembly-Version Navigieren Sie nun zu der Installation von TestApplication.exe. Sie werden sofort sehen, dass das Konfigurationstool eine Anwendungskonfigurationsdatei erzeugt hat. Starten Sie TestApplication, wird die neuere Version von GeometricObjects aufgerufen, was Sie an der Konsolenausgabe 2.0.0.0 erkennen. Tatsächlich ist es uns gelungen, eine Anwendung ohne Neukompilierung anzuweisen, eine andere externe Komponentenversion aufzurufen. Angenommen, die externe Komponente ist nicht abwärtskompatibel und die darauf zugreifende Anwendung hat Probleme mit ihr, dann können Sie in der Anwendungskonfigurationsdatei die Versionsumleitung wieder löschen. Werfen wir zum Schluss auch noch einen Blick in die vom Konfigurationstool erzeugte Anwendungskonfigurationsdatei:
    <?xml version="1.0"?>
    <configuration>
      <runtime>
        <assemblyBinding
                 xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="GeometricObjects"
                              publicKeyToken="3e8e8aeaabe7ee94" />
            <publisherPolicy apply="yes" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
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, zum Beispiel:
    <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. ### 15.4.1 Herausgeberrichtliniendatei Eine Herausgeberrichtliniendatei ist eine Konfigurationsdatei, die vom Komponentenentwickler zu einer Assembly kompiliert und im GAC installiert worden ist. Das Kompilat, die sogenannte Herausgeberrichtlinien-Assembly, 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 Herausgeberrichtlinien-Assembly müssen Sie allerdings auf ein Kommandozeilentool zurückgreifen, weil es keinen entsprechenden Assistenten in Visual Studio 2010 gibt. Bei dem Tool handelt es sich um den Assembly Linker al.exe, der im Verzeichnis \Programme\Microsoft SDKs\Windows\v7.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 Herausgeberrichtlinien-Assembly und zum Schluss auch noch die Schlüsseldatei:
    al /link:<Publisherrichtliniendatei> /out:<Ausgabedatei> /keyfile:<SNK-Datei>
Dem Bezeichner der Ausgabedatei, also der Herausgeberrichtlinien-Assembly, ist besondere Aufmerksamkeit zu widmen, da er 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 Publisherrichtlinien-Assembly wie folgt lauten:
    al /link:new.config /out:policy.1.0.GeometricObjects.dll /keyfile:MyKey.snk
Eine Bindung an eine neue Assembly-Version im GAC umzuleiten, ist ein gravierender Eingriff auf dem Rechner eines Benutzers. Durch die Angabe der Schlüsseldatei, die natürlich dieselbe sein muss, mit der auch der starke Name der Assembly erzeugt wird, sichert der Entwickler seine Berechtigung für diesen Eingriff zu. Die Herausgeberrichtlinien-Assembly muss zusammen mit der Assembly im GAC installiert werden. Dazu können Sie wieder das Tool gacutil mit dem Schalter /i benutzen, z. B. so:
    gacutil /i policy.1.0.ProcessServer.dll