Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sammelbare Assemblys sind dynamische Assemblys , die entladen werden können, ohne die Anwendungsdomäne zu entladen, in der sie erstellt wurden. Der verwaltete und nicht verwaltete Speicher, der von einer entladbaren Assembly und den darin enthaltenen Typen verwendet wurde, kann wieder freigegeben werden. Informationen wie der Name der Assembly werden aus den internen Tabellen entfernt.
Verwenden Sie zum Aktivieren des Entladens das AssemblyBuilderAccess.RunAndCollect Kennzeichen, wenn Sie eine dynamische Assembly erstellen. Die Assembly ist vorübergehend (d. h., sie kann nicht gespeichert werden) und unterliegt einschränkungen, die im Abschnitt "Einschränkungen für sammelbare Assemblys " beschrieben sind. Die Common Language Runtime (CLR) entlädt automatisch eine Sammelassembly, wenn Sie alle objekte freigeben, die der Assembly zugeordnet sind. In allen anderen Aspekten werden Sammelassemblys erstellt und auf die gleiche Weise wie andere dynamische Assemblys verwendet.
Lebensdauer von sammelbaren Baugruppen
Die Lebensdauer einer sammelbaren Assembly wird durch das Vorhandensein von Verweisen auf die darin enthaltenen Typen und die Objekte gesteuert, die aus diesen Typen erstellt werden. Die Common Language Runtime entlädt keine Assembly, solange mindestens eins der folgenden Komponenten vorhanden ist (T ist ein beliebiger Typ, der in der Assembly definiert ist):
Eine Instanz von
T.Eine Instanz eines Arrays von
T.Eine Instanz eines generischen Typs, der
Tals eines der Typargumente verfügt. Dies umfasst generische Auflistungen vonT, auch wenn diese Sammlung leer ist.Eine Instanz von Type oder TypeBuilder die darstellt
T.Von Bedeutung
Sie müssen alle Objekte freigeben, die Teile der Assembly darstellen. Die Definition von ModuleBuilder behält einen Verweis auf das
Tund das TypeBuilder-Objekt behält einen Verweis auf das AssemblyBuilder bei, daher müssen die Verweise auf diese Objekte freigegeben werden. Auch das Vorhandensein einer LocalBuilder- oder ILGenerator-Klasse, die bei der Erstellung vonTverwendet werden, verhindert das Entladen.Ein statischer Verweis auf
Tdurch einen anderen dynamisch definierten TypT1, der weiterhin durch Ausführen von Code erreichbar ist.T1könnte zum Beispiel vonTabgeleitet werden, oderTkönnte der Typ eines Parameters in einer Methode vonT1sein.Ein
ByRefauf ein statisches Feld, das zuTgehört.A RuntimeTypeHandle, RuntimeFieldHandle oder RuntimeMethodHandle, die sich auf
Toder eine Komponente vonTbezieht.Eine Instanz eines Spiegelungsobjekts, das indirekt oder direkt für den Zugriff auf das Type-Objekt verwendet werden kann, das das
T-Objekt darstellt. Ein Beispiel: Das Type Objekt fürTkann aus einem Arraytyp abgerufen werden, dessen ElementtypTist, oder aus einem generischen Typ mit dem TypargumentT.Eine Methode
Mim Aufrufstapel eines beliebigen Threads, wobeiMeine Methode vonToder eine Methode auf Modulebene ist, die in der Assembly definiert ist.Ein Delegat für eine statische Methode, die in einem Modul der Assembly definiert ist.
Wenn nur ein Element aus dieser Liste für nur einen Typ oder eine Methode in der Assembly vorhanden ist, kann die Laufzeit die Assembly nicht entladen.
Hinweis
Die Runtime entlädt die Assembly nicht, bevor Finalizer für alle Elemente in der Liste ausgeführt wurden.
Für Zwecke der Lebensdauerverfolgung wird ein generisch konstruierter Typ wie List<int> (in C#) oder List(Of Integer) (in Visual Basic), der bei der Erzeugung einer sammelbaren Assembly erstellt und verwendet wird, als entweder in der Assembly definiert angesehen, die die generische Typdefinition enthält, oder in einer Assembly, die die Definition eines seiner Typargumente enthält. Die genaue Assembly, die verwendet wird, ist ein Implementierungsdetail und kann geändert werden.
Einschränkungen bei entladbaren Assemblys
Für entladbare Assemblys gelten folgende Einschränkungen:
Statische Verweise
Typen in einer normalen dynamischen Assembly können keine statischen Verweise auf Typen aufweisen, die in einer sammelbaren Assembly definiert sind. Wenn Sie beispielsweise einen normalen Typ definieren, der von einem Typ in einer entladbaren Assembly erbt, wird eine NotSupportedException-Ausnahme ausgelöst. Ein Typ in einer Sammelassembly kann statische Verweise auf einen Typ in einer anderen sammelbaren Assembly aufweisen, dies erweitert jedoch die Lebensdauer der referenzierten Assembly auf die Lebensdauer der referenzierenden Assembly.
Die folgenden Einschränkungen gelten für sammelbare Assemblys in .NET Framework:
COM-Interoperabilität
Es können keine COM-Schnittstellen innerhalb einer sammelbaren Assembly definiert werden, und es können keine Instanzen von Typen innerhalb einer sammelbaren Assembly in COM-Objekte konvertiert werden. Ein Typ in einer entladbaren Assembly kann nicht als COM Callable Wrapper (CCW) oder Runtime Callable Wrapper (RCW) verwendet werden. Typen in sammelbaren Assemblys können jedoch Objekte verwenden, die COM-Schnittstellen implementieren.
Plattformaufruf
Methoden, die das DllImportAttribute Attribut besitzen, werden nicht kompiliert, wenn sie in einer sammelbaren Assembly deklariert werden. Die OpCodes.Calli-Anweisung kann nicht in der Implementierung eines Typs in einer entladbaren Assembly verwendet werden, und solche Typen können nicht an nicht verwalteten Code gemarshallt werden. Sie können jedoch nativen Code aufrufen, indem Sie einen Einstiegspunkt verwenden, der in einer nicht sammelbaren Assembly deklariert ist.
Marshalling
Objekte (insbesondere Delegate), die in entladbaren Assemblys definiert sind, können nicht gemarshallt werden. Dies ist eine Einschränkung für alle flüchtig emittierten Typen.
Laden von Assemblys
Die Reflexionsausgabe stellt den einzigen Mechanismus dar, der zum Laden von entladbaren Assemblys unterstützt wird. Assemblys, die mithilfe einer anderen Methode zum Laden von Assemblys geladen werden, können nicht entladen werden.
Kontextgebundene Objekte
Kontextstatische Variablen werden nicht unterstützt. Typen in einer entladbaren Assembly können ContextBoundObject nicht erweitern. Code in sammelbaren Assemblys kann jedoch kontextgebundene Objekte verwenden, die an anderer Stelle definiert sind.
Threadstatische Daten
Threadstatische Variablen werden nicht unterstützt.
Die folgenden Einschränkungen gelten für sammelbare Assemblys in .NET Framework- und .NET-Versionen vor .NET 9:
Statische Felder mit
FixedAddressValueTypeAttributeAuf statische Felder, die in entladbaren Assemblys definiert sind, kann das FixedAddressValueTypeAttribute-Attribut nicht angewandt werden.