Entladbare Assemblys für die dynamische Typgenerierung

Entladbare Assemblys sind dynamische Assemblys, die entladen werden können, ohne die Anwendungsdomäne zu entladen, in der sie erstellt wurden. Der gesamte verwaltete und nicht verwaltete, von einer entladbaren Assembly verwendete Arbeitsspeicher sowie die enthaltenen Typen können freigegeben werden. Informationen, z. B. der Assemblyname, werden aus internen Tabellen entfernt.

Das Entladen ermöglichen Sie, indem Sie beim Erstellen einer dynamischen Assembly das AssemblyBuilderAccess.RunAndCollect-Flag verwenden. Die Assembly ist flüchtig (das heißt, sie kann nicht gespeichert werden) und unterliegt in den im Abschnitt Einschränkungen für entladbare Assemblys beschriebenen Einschränkungen. Die Common Language Runtime (CLR) entlädt entladbare Assemblys automatisch, wenn Sie alle der Assembly zugeordneten Objekte freigegeben haben. In jeder anderen Hinsicht werden entladbare Assemblys genau wie andere dynamische Assemblys erstellt und verwendet.

Lebensdauer entladbarer Assemblys

Die Lebensdauer einer entladbaren dynamischen Assembly wird durch das Vorhandensein von Verweisen auf die enthaltenen Typen sowie die Objekte, die aus diesen Typen erstellt werden, bestimmt. Die Common Language Runtime entlädt Assemblys nicht, solange eines oder mehrere der folgenden Elemente vorhanden sind (T steht für jeden in der Assembly definierten Typ):

  • Eine Instanz von T.

  • Eine Instanz eines Arrays von T, oder eine Instanz einer generischen Auflistung, für die T als Typargument festgelegt ist. Dies gilt auch dann, wenn dieses Array oder diese Auflistung leer ist.

  • Eine Instanz von Type oder TypeBuilder, die T darstellt.

Hinweis

Sie müssen alle Objekte freigeben, die Teile der Assembly darstellen.Der ModuleBuilder, von dem T definiert wurde, behält einen Verweis auf den TypeBuilder bei, und das AssemblyBuilder-Objekt behält einen Verweis auf den ModuleBuilder bei, daher müssen Verweise auf diese Objekte freigegeben werden.Auch das Vorhandensein eines LocalBuilder oder eines ILGenerator, der beim Erstellen von T verwendet wurde, verhindert den Entladevorgang.

  • Ein statischer Verweis auf T durch einen anderen dynamisch definierten Typ T1, der für ausgeführten Code weiterhin erreichbar ist. Beispielsweise kann T1 von T abgeleitet sein, oder möglicherweise bildet T den Typ eines Parameters in einer Methode von T1.

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

  • Ein RuntimeTypeHandle, RuntimeFieldHandle oder RuntimeMethodHandle, das auf T oder auf eine Komponente von T verweist.

  • Eine Instanz eines beliebigen Reflektionsobjekts, das indirekt oder direkt für den Zugriff auf das Type-Objekt verwendet werden kann, das T darstellt. Das Type-Objekt für T kann beispielsweise von einem Arraytyp abgerufen werden, dessen Elementtyp T ist, oder aber von einem generischen Typ, für den T als Typargument festgelegt ist.

  • Ein Methode M für die Aufrufliste eines beliebigen Threads, wobei M eine Methode von T oder aber eine Methode auf Modulebene ist, die in der Assembly definiert wird.

  • Ein Delegat für eine statische Methode, die in einem Modul der Assembly definiert ist.

Wenn nur ein Element dieser Liste für nur einen Typ oder eine Methode in der Assembly vorhanden ist, kann die Assembly von der Laufzeit nicht entladen werden.

Hinweis

Die Laufzeit entlädt die Assembly eigentlich erst, wenn für alle Elemente in der Liste Finalizer ausgeführt wurden.

Zu Zwecken der Lebensdauernachverfolgung wird davon ausgegangen, dass ein konstruierter generischer Typ, z. B. List<int> (List(Of Integer) in Visual Basic), der beim Generieren einer entladbaren Assembly erstellt und verwendet wird, in der Assembly mit der Definition des generischen Typs oder aber in einer Assembly mit der Definition einer seiner Typargumente definiert wurde. Die tatsächlich verwendete Assembly ist implementierungsspezifisch und unterliegt möglichen Änderungen.

Einschränkungen für entladbare Assemblys

Für entladbare Assemblys gelten die folgenden Einschränkungen:

  • Statische Verweise   Typen in einer normalen dynamischen Assembly können keine statischen Verweise auf Typen aufweisen, die in einer entladbaren Assembly definiert sind. Wenn Sie beispielsweise einen normalen Typ definieren, der einen Typ in einer entladbaren Assembly erbt, wird eine NotSupportedException-Ausnahme ausgelöst. Ein Typ in einer entladbaren Assembly kann statische Verweise auf einen Typ in einer anderen entladbaren Assembly aufweisen, jedoch wird damit die Lebensdauer der Assembly, auf die verwiesen wird, so verlängert, dass diese der Lebensdauer der verweisenden Assembly entspricht.

  • COM-Interop   In einer entladbaren Assembly können keine COM-Schnittstellen definiert werden, und Instanzen von Typen in einer entladbaren Assembly können nicht in COM-Objekte konvertiert werden. Typen in einer entladbaren Assembly können nicht als COM Callable Wrappers (CCW) oder Runtime Callable Wrappers (RCW) dienen. Typen in entladbaren Assemblys können jedoch Objekte verwenden, die COM-Schnittstellen implementieren.

  • Plattformaufruf   Methoden mit dem DllImportAttribute-Attribut werden nicht kompiliert, wenn Sie in einer entladbaren 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 zu nicht verwaltetem Code gemarshallt werden. Sie können jedoch systemeigenen Code aufrufen, indem Sie einem Einstiegspunkt verwenden, der in einer nicht entladbaren Assembly deklariert wurde.

  • Marshallen   In entladbaren Assemblys definierte Objekte (insbesondere Delegaten) können nicht gemarshallt werden. Diese Einschränkung gilt für alle flüchtigen ausgegebenen Typen.

  • Assemblyladevorgang   Die Reflektionsausgabe bildet den einzigen unterstützten Mechanismus zum Laden entladbarer Assemblys. Assemblys, die durch eine beliebige andere Form von Assemblyladevorgang geladen wurden, können nicht entladen werden.

  • Kontextgebundene Objekte   Kontextunabhängige Variablen werden nicht unterstützt. Typen in einer entladbaren Assembly können ContextBoundObject nicht erweitern. Codieren in entladbaren Assemblys kann jedoch kontextgebundene Objekte verwenden, die an anderer Stelle definiert sind.

  • Threadunabhängige Daten   Threadunabhängige Variablen werden nicht unterstützt.

Siehe auch

Weitere Ressourcen

Ausgeben von dynamischen Methoden und Assemblys