次の方法で共有


動的な型生成のための収集可能なアセンブリ

Collectible アセンブリ は動的アセンブリであり、作成されたアプリケーション ドメインをアンロードせずにアンロードできます。 収集可能なアセンブリによって使用されるすべてのマネージド メモリとアンマネージド メモリと、そのアセンブリに含まれる型を再利用できます。 アセンブリ名などの情報は、内部テーブルから削除されます。

アンロードを有効にするには、動的アセンブリを作成するときに AssemblyBuilderAccess.RunAndCollect フラグを使用します。 アセンブリは一時的なもの (つまり、保存できません) であり、「 収集可能なアセンブリの制限 」セクションで説明されている制限の対象となります。 共通言語ランタイム (CLR) は、アセンブリに関連付けられているすべてのオブジェクトを解放すると、収集可能なアセンブリを自動的にアンロードします。 他のすべての点で、収集可能なアセンブリは、他の動的アセンブリと同じ方法で作成および使用されます。

収集可能なアセンブリの有効期間

収集可能なアセンブリの有効期間は、そのアセンブリに含まれる型と、それらの型から作成されたオブジェクトへの参照の存在によって制御されます。 共通言語ランタイムは、次の 1 つ以上が存在する限り、アセンブリをアンロードしません (T は、アセンブリで定義されている任意の型です)。

  • Tのインスタンス。

  • Tの配列のインスタンス。

  • 型引数の 1 つとして T を持つジェネリック型のインスタンス。 これには、そのコレクションが空の場合でも、 Tのジェネリック コレクションが含まれます。

  • Tを表すTypeまたはTypeBuilderのインスタンス。

    Von Bedeutung

    アセンブリの一部を表すオブジェクトをすべて解放する必要があります。 T定義するModuleBuilderTypeBuilderへの参照を保持し、AssemblyBuilder オブジェクトはModuleBuilderへの参照を保持するため、これらのオブジェクトへの参照を解放する必要があります。 Tの構築に使用されるLocalBuilderILGeneratorが存在する場合でも、アンロードを防ぐことができます。

  • コードを実行しても到達可能な別の動的に定義された型T1によってTへの静的参照。 たとえば、T1Tから派生したり、TT1メソッドのパラメーターの型である場合があります。

  • Tに属する静的フィールドへのByRef

  • TまたはTのコンポーネントを参照するRuntimeTypeHandleRuntimeFieldHandle、またはRuntimeMethodHandle

  • Tを表すType オブジェクトに間接的または直接アクセスするために使用できるリフレクション オブジェクトのインスタンス。 たとえば、TType オブジェクトは、要素型がT配列型から取得することも、型引数としてTジェネリック型から取得することもできます。

  • メソッドは、任意のスレッドの呼び出し履歴に M します。 M は、 T のメソッドまたはアセンブリで定義されているモジュール レベルのメソッドです。

  • アセンブリのモジュールで定義されている静的メソッドへのデリゲート。

アセンブリ内の 1 つの型または 1 つのメソッドにのみこのリストの項目が 1 つだけ存在する場合、ランタイムはアセンブリをアンロードできません。

リスト内のすべての項目に対してファイナライザーが実行されるまで、ランタイムはアセンブリを実際にアンロードしません。

有効期間を追跡するために、収集可能なアセンブリの生成で作成および使用される List<int> (C# の場合) や List(Of Integer) (Visual Basic の場合) などの構築されたジェネリック型は、ジェネリック型定義を含むアセンブリまたは型引数のいずれかの定義を含むアセンブリで定義されていると見なされます。 使用される正確なアセンブリは実装の詳細であり、変更される可能性があります。

収集可能なアセンブリに関する制限事項

収集可能なアセンブリには、次の制限が適用されます。

  • 静的参照

    通常の動的アセンブリ内の型は、収集可能なアセンブリで定義されている型への静的参照を持つことはできません。 たとえば、収集可能なアセンブリ内の型から継承する通常の型を定義すると、 NotSupportedException 例外がスローされます。 収集可能アセンブリ内の型は、別の収集可能アセンブリ内の型への静的参照を持つことができますが、これにより、参照されるアセンブリの有効期間が参照アセンブリの有効期間まで延長されます。

.NET Framework の収集可能なアセンブリには、次の制限が適用されます。

  • COM 相互運用機能

    収集可能なアセンブリ内で COM インターフェイスを定義することはできません。また、収集可能なアセンブリ内の型のインスタンスを COM オブジェクトに変換することはできません。 収集可能アセンブリ内の型は、COM 呼び出し可能ラッパー (CCW) またはランタイム呼び出し可能ラッパー (RCW) として機能できません。 ただし、収集可能なアセンブリの型では、COM インターフェイスを実装するオブジェクトを使用できます。

  • プラットフォーム呼び出し

    DllImportAttribute属性を持つメソッドは、収集可能なアセンブリで宣言されている場合はコンパイルされません。 OpCodes.Calli命令は、収集可能なアセンブリ内の型の実装では使用できません。また、このような型をアンマネージ コードにマーシャリングすることはできません。 ただし、収集不可能なアセンブリで宣言されているエントリ ポイントを使用して、ネイティブ コードを呼び出すことができます。

  • マーシャ リング

    収集可能なアセンブリで定義されているオブジェクト (特にデリゲート) はマーシャリングできません。 これは、一時的に出力されるすべての型に対する制限です。

  • アセンブリの読み込み

    リフレクション出力は、収集可能なアセンブリの読み込みにサポートされている唯一のメカニズムです。 他の形式のアセンブリ読み込みを使用して読み込まれたアセンブリはアンロードできません。

  • コンテキスト バインド オブジェクト

    コンテキスト静的変数はサポートされていません。 収集可能なアセンブリ内の型は、 ContextBoundObjectを拡張できません。 ただし、収集可能なアセンブリ内のコードでは、他の場所で定義されているコンテキスト バインド オブジェクトを使用できます。

  • スレッド静的データ

    スレッド静的変数はサポートされていません。

.NET 9 より前の .NET Framework および .NET バージョンの収集可能なアセンブリには、次の制限が適用されます。

  • を含む静的フィールド FixedAddressValueTypeAttribute

    収集可能なアセンブリで定義されている静的フィールドには、 FixedAddressValueTypeAttribute 属性を適用できません。

こちらも参照ください