Freigeben über


Entladbare Assemblys für die dynamische Typgenerierung

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 T als eines der Typargumente verfügt. Dies umfasst generische Auflistungen von T, 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 T und 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 von T verwendet werden, verhindert das Entladen.

  • Ein statischer Verweis auf T durch einen anderen dynamisch definierten Typ T1, der weiterhin durch Ausführen von Code erreichbar ist. T1 könnte zum Beispiel von T abgeleitet werden, oder T könnte der Typ eines Parameters in einer Methode von T1 sein.

  • Ein ByRef auf ein statisches Feld, das zu T gehört.

  • A RuntimeTypeHandle, RuntimeFieldHandle oder RuntimeMethodHandle, die sich auf T oder eine Komponente von T bezieht.

  • 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ür T kann aus einem Arraytyp abgerufen werden, dessen Elementtyp T ist, oder aus einem generischen Typ mit dem Typargument T.

  • Eine Methode M im Aufrufstapel eines beliebigen Threads, wobei M eine Methode von T oder 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 FixedAddressValueTypeAttribute

    Auf statische Felder, die in entladbaren Assemblys definiert sind, kann das FixedAddressValueTypeAttribute-Attribut nicht angewandt werden.

Siehe auch