| Assemblies enthalten neben den eigentlichen Typen dazugehörige Metadaten. Während zur Laufzeit einer .NET-basierenden Anwendung nach und nach weitere Assemblies in die Anwendungsdomäne geladen werden können, kann das Entladen einer Assembly nur durch Entladen der enthaltenden Anwendungsdomäne erfolgen. In den meisten kleineren Anwendungen, die nur aus einer einzigen Anwendungsdomäne bestehen, wird dies direkt vor dem Beenden der Anwendung stattfinden. Um die Funktionsfähigkeit der zuvor beschriebenen Vorgehensweise zur Implementierung gemeinsamer Destruktoren zu überprüfen, soll eine Testanwendung erstellt werden, die eine Assembly lädt, gemeinsame Methoden einer der enthaltenen Klassen aufruft und anschliessend die hinzugeladene Assembly wieder entlädt. Bei Entladen der Assembly wird der Typ mit dem gemeinsamen Destruktor der umschliessenden Klasse ebenfalls entladen und dessen Destruktor aufgerufen. Damit eine hinzugeladene Assembly zur Laufzeit vor Programmende entladen werden kann, ist es notwendig (aber nicht hinreichend), eine zweite Anwendungsdomäne zu erstellen und die Assembly in die zusätzliche Anwendungsdomäne zu laden. Zusätzlich muss bei Einsatz mehrerer Anwendungsdomänen darauf geachtet werden, dass Zugriffe auf Typen und Metadaten einer hinzugeladenen Assembly nicht direkt von der Hauptanwendungsdomäne der Anwendung aus erfolgen, da dies zur Folge hätte, dass die Assembly bei Entladen der zweiten Anwendungsdomäne nicht entladen werden kann. Die Verwendung von Reflection zum Zugriff auf die hinzugeladene Assembly ist ebenfalls nicht ausreichend, da hierdurch auch die Assembly gesperrt werden würde. Zur Umgehung des Sperrens einer Assembly bei Zugriff auf darin enthaltene Daten kann die im Artikel „Executing Dynamic Code in .NET“ von Rick Strahl [MVP] vorgestellte Vorgehensweise gewählt werden. Dabei wird eine zusätzliche Proxyassembly RemoteLoader.dll eingeführt. Diese Assembly fungiert als Proxy, lädt die Assembly, welche den Typ Class1 enthält, in die von der Hauptanwendungsdomäne entfernte Anwendungsdomäne und gibt einen Schnittstellenzeiger an die Hauptanwendungsdomäne zurück. Die Hauptanwendungdomäne kommuniziert über diese Schnittstelle anschliessend mit dem Anwendungsdomänenproxy, um Daten an die dritte Assembly zu übergeben und von dieser zu empfangen. Die Proxyassembly kann direkt in der Hauptassembly benutzt werden, da deren Typinformationen bereits zur Kompilierungszeit in der Hauptassembly verfügbar sein dürfen. |