AssemblyLoadContext クラス

定義

アセンブリ読み込みのスコープのランタイムの概念を表します。

public ref class AssemblyLoadContext
public ref class AssemblyLoadContext abstract
public class AssemblyLoadContext
public abstract class AssemblyLoadContext
type AssemblyLoadContext = class
Public Class AssemblyLoadContext
Public MustInherit Class AssemblyLoadContext
継承
AssemblyLoadContext

注釈

AssemblyLoadContextは、読み込みコンテキストを表します。 概念的には、読み込みコンテキストによって、一連のアセンブリの読み込み、解決、およびアンロードのスコープが作成されます。

AssemblyLoadContextは、主にアセンブリの読み込み分離を提供するために存在します。 これにより、同じアセンブリの複数のバージョンを 1 つのプロセス内に読み込むことができます。 .NET Framework の複数の AppDomain インスタンスによって提供される分離メカニズムが置き換えられます。

Note

  • AssemblyLoadContext では、セキュリティ機能は提供されません。 すべてのコードには、プロセスの完全なアクセス許可があります。
  • .NET Core 2.0 - 2.2 でのみ、 AssemblyLoadContext は抽象クラスです。 これらのバージョンで具象クラスを作成するには、 AssemblyLoadContext.Load(AssemblyName) メソッドを実装します。

ランタイムでの使用方法

ランタイムは、次の 2 つのアセンブリ読み込みコンテキストを実装します。

  • AssemblyLoadContext.Default はランタイムの既定のコンテキストを表します。これは、アプリケーションのメイン アセンブリとその静的な依存関係に使用されます。
  • Assembly.LoadFile(String) メソッドは、最も基本的なAssemblyLoadContextをインスタンス化することによって、読み込むアセンブリを分離します。 依存関係の解決なしで各アセンブリを独自の AssemblyLoadContext に読み込む単純な分離スキームがあります。

アプリケーションの使用状況

アプリケーションは、独自の AssemblyLoadContext を作成して、高度なシナリオ用のカスタム ソリューションを作成できます。 このカスタマイズでは、依存関係解決メカニズムの定義に重点を置いています。

AssemblyLoadContextには、マネージド アセンブリ解決を実装するための 2 つの拡張ポイントが用意されています。

  1. AssemblyLoadContext.Load(AssemblyName) メソッドは、AssemblyLoadContextがアセンブリを解決、読み込み、および返す最初の機会を提供します。 AssemblyLoadContext.Load(AssemblyName) メソッドがnullを返す場合、ローダーはアセンブリをAssemblyLoadContext.Defaultに読み込もうとします。
  2. AssemblyLoadContext.Defaultがアセンブリを解決できない場合、元のAssemblyLoadContextはアセンブリを解決する 2 回目の機会を得ます。 ランタイムは、 Resolving イベントを発生させます。

さらに、 AssemblyLoadContext.LoadUnmanagedDll(String) 仮想メソッドを使用すると、既定のアンマネージド アセンブリ解決をカスタマイズできます。 既定の実装は nullを返します。これにより、ランタイム検索で既定の検索ポリシーが使用されます。 ほとんどのシナリオでは、既定の検索ポリシーで十分です。

技術的な課題

  • 1 つのプロセスで複数のバージョンのランタイムを読み込むことはできません。

    注意事項

    複数のコピーまたは異なるバージョンのフレームワーク アセンブリを読み込むと、予期しない、診断が困難な動作につながる可能性があります。

    Tip

    この分離の問題を解決するには、リモート処理またはプロセス間通信でプロセス境界を使用します。

  • アセンブリの読み込みのタイミングにより、テストとデバッグが困難になる可能性があります。 通常、アセンブリは、依存関係が直ちに解決されずに読み込まれます。 依存関係は、必要に応じて読み込まれます。

    • コードが依存アセンブリに分岐する場合。
    • コードがリソースを読み込む場合。
    • コードがアセンブリを明示的に読み込む場合。
  • AssemblyLoadContext.Load(AssemblyName)の実装では、異なるバージョンを存在させるために分離する必要がある新しい依存関係を追加できます。 最も自然な実装では、これらの依存関係が既定のコンテキストに配置されます。 慎重な設計により、新しい依存関係を分離できます。

  • 同じアセンブリが異なるコンテキストに複数回読み込まれます。

    • これにより、"'Sample.Plugin' 型のオブジェクトを 'Sample.Plugin' 型にキャストできません" などのエラー メッセージが混乱する可能性があります。
    • 分離境界を越えたマーシャリングは簡単ではありません。 一般的な解決策は、既定の読み込みコンテキストにのみ読み込まれるアセンブリで定義されたインターフェイスを使用することです。

コンストラクター

名前 説明
AssemblyLoadContext()

AssemblyLoadContext クラスの新しいインスタンスを初期化します。

AssemblyLoadContext(Boolean)

アンロードが有効かどうかを示す値を使用して、 AssemblyLoadContext クラスの新しいインスタンスを初期化します。

AssemblyLoadContext(String, Boolean)

名前とアンロードが有効かどうかを示す値を使用して、 AssemblyLoadContext クラスの新しいインスタンスを初期化します。

プロパティ

名前 説明
All

すべての AssemblyLoadContext インスタンスのコレクションを返します。

Assemblies

Assemblyに読み込まれたAssemblyLoadContext インスタンスのコレクションを返します。

CurrentContextualReflectionContext

AssemblyLoadContextの最新の呼び出しによって設定されたEnterContextualReflection()を取得します。

Default

既定の AssemblyLoadContextを取得します。 既定のコンテキストには、メイン アプリケーション アセンブリとその静的依存関係が含まれます。

IsCollectible

この AssemblyLoadContext が収集可能かどうかを示す値を取得します。

Name

AssemblyLoadContextの名前を取得します。

メソッド

名前 説明
EnterContextualReflection()

CurrentContextualReflectionContextthisAssemblyLoadContextに設定します。

EnterContextualReflection(Assembly)

アセンブリを読み込んだCurrentContextualReflectionContextAssemblyLoadContextを設定します。

Equals(Object)

指定したオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
Finalize()

オブジェクトがガベージ コレクションによって再利用される前に、リソースの解放やその他のクリーンアップ操作の実行を試みることができます。

GetAssemblyName(String)

アセンブリ パスの AssemblyName を取得します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetLoadContext(Assembly)

指定したAssemblyLoadContextを含むAssemblyを取得します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
Load(AssemblyName)

派生クラスでオーバーライドされると、その AssemblyNameに基づいてアセンブリを解決できます。

LoadFromAssemblyName(AssemblyName)

AssemblyNameを指定してアセンブリを解決して読み込みます。

LoadFromAssemblyPath(String)

指定したパスにアセンブリ ファイルの内容を読み込みます。

LoadFromNativeImagePath(String, String)

指定したパス上のマネージド アセンブリ ファイルのネイティブ イメージの内容を読み込みます。

LoadFromStream(Stream, Stream)

マネージド アセンブリを含む共通オブジェクト ファイル形式 (COFF) ベースのイメージ (必要に応じてアセンブリのシンボルを含む) を使用してアセンブリを読み込みます。

LoadFromStream(Stream)

マネージド アセンブリを含む共通オブジェクト ファイル形式 (COFF) ベースのイメージを使用してアセンブリを読み込みます。

LoadUnmanagedDll(String)

派生クラスがアンマネージ ライブラリを名前で読み込むことができます。

LoadUnmanagedDllFromPath(String)

指定したパスからアンマネージド ライブラリを読み込みます。

MemberwiseClone()

現在の Objectの簡易コピーを作成します。

(継承元 Object)
SetProfileOptimizationRoot(String)

この読み込みコンテキストの最適化プロファイルが格納されるルート パスを設定します。

StartProfileOptimization(String)

指定したプロファイルのプロファイル最適化を開始します。

ToString()

この読み込みコンテキストの文字列形式を返します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
Unload()

この AssemblyLoadContextのアンロードを開始します。

イベント

名前 説明
Resolving

このアセンブリ読み込みコンテキストに読み込もうとしたときにアセンブリの解決が失敗したときに発生します。

ResolvingUnmanagedDll

ネイティブ ライブラリの解決が失敗したときに発生します。

Unloading

AssemblyLoadContextがアンロードされるときに発生します。

適用対象

こちらもご覧ください