Assemblys dem Global Assembly Cache hinzufügen

Von Mathias Schiffer

Der Global Assembly Cache enthält zur allgemeinen Verwendung freigegebene Komponenten. Hier erfahren Sie, wie Sie Ihre Assembly dort unterbringen können.

Der "Global Assembly Cache" (GAC) ist ein zentraler Speicherort, in dem sich freigegebene Komponenten befinden. Das bedeutet, dass jede .NET-Anwendung auf diese zentral eingerichteten Komponenten zugreifen darf.

Dabei ergeben sich neben der offenen Nutzbarkeit Vorteile und Nachteile: Während die Performance durch einmalige Instanziierung und wegfallende Aufgaben der Common Language Runtime profitiert, entfällt etwa die Möglichkeit des "XCOPY-Deployment" ("Installation" durch bloßes Kopieren der Anwendungsdateien). Obwohl auch der GAC die parallele Vorhaltung verschiedener Versionen einer Komponente unterstützt, steht er zudem in der Gefahr, das leidige Schicksal des SYSTEM32-Verzeichnisses jeder reiferen Windows-Installation zu erleiden: Komponenten im Überfluss tragen zu müssen. Die Nutzung des GAC sollte also wohlüberlegt sein.

Der GAC findet sich physikalisch im Windows-Unterverzeichnis "assembly". Sie können ihn ganz einfach mit dem Windows Explorer einsehen. Hier können Sie auch Assemblys per Drag&Drop dem GAC hinzufügen oder mithilfe des Explorer-Kontextmenüs löschen. Möglich macht diese Sonderbehandlung die Shell-Erweiterung shfusion.dll aus dem Microsoft .NET Framework SDK.

Natürlich können Sie Assemblys auch programmatisch dem Assembly Cache hinzufügen: Hierfür steht das Utility GACUtil aus dem .NET Framework SDK zur Verfügung. Mit dem Zeilenschalter /I (für Installation) und dem Pfad zur Assembly können Sie die betroffene Assembly dem Cache hinzufügen.

Beide Möglichkeiten erfordern jedoch, dass ein Hinzufügen der Asssembly zum Assembly Cache überhaupt statthaft ist! Hierfür ist es zunächst erforderlich, die Assembly zu signieren. Den dafür benötigten Signaturschlüssel können Sie mit dem StrongName-Utility SN.EXE erzeugen, das Sie ebenfalls mit dem .NET Framework SDK erhalten: Verwenden Sie den Zeilenschalter -k, um einen "key" zu erzeugen. Dieser wird in einer Datei abgelegt, die Sie nach dem Zeilenschalter angeben, also z.B.:

sn.exe z:\beispiele\meinschluessel.snk

Den erzeugten Schlüssel können Sie nun Ihrem Projekt hinzufügen, indem Sie die Datei AssemblyInfo.vb um das Attribut AssemblyKeyFile erweitern:

<Assembly: AssemblyKeyFile("javascript:void(null);")>

Erstellen Sie die Assembly nun neu, so ist sie bereit dafür, mithilfe von GACUtil dem Global Assembly Cache hinzugefügt zu werden.

GACUtil.exe /i z:\beispiele\MeineAssembly.exe

Auch die Deinstallation einer Assembly aus dem GAC ist mithilfe des Utilities GACUtil kein Problem: Verwenden Sie einfach den Zeilenschalter /u für "Uninstall".

GACUtil.exe /u MeineAssembly

Damit sind die Möglichkeiten von GACUtil jedoch noch nicht erschöpft. So können Sie etwa über den Parameter /r auch Referenzzählungen einsetzen (um etwa bei Installation mehrerer Anwendungen, die dieselbe Komponente im GAC installieren, über funktionierende Deinstallations-Mechanismen verfügen zu können). Auch steht natürlich die Möglichkeit zur Verfügung, über Angabe entsprechender Parameter von mehreren installierten Versionen einer Assembly nur eine bestimmte Version aus dem GAC zu entfernen. Natürlich übernehmen professionelle Installationsprogramme solche Installations- und Deinstallationsdetails für Sie. Doch auch ein "kurzer Blick unter die Haube" schadet nie.

Mehr Informationen zur Anwendung von GACUtil.exe finden Sie in der MSDN Library unter https://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cptools/html/cpgrfglobalassemblycacheutilitygacutilexe.asp

Interessante Details zum StrongName-Tool SN.EXE finden Sie unter der MSDN-Adresse https://msdn.microsoft.com/library/DEU/cptools/html/cpgrfStrongNameUtilitySNexe.asp