次の方法で共有


マネージド アセンブリ読み込みアルゴリズム

マネージド アセンブリは、さまざまなステージを持つアルゴリズムを使用して配置および読み込まれます。

サテライト アセンブリと WinRT アセンブリを除くすべてのマネージド アセンブリは、同じアルゴリズムを使用します。

マネージド アセンブリはいつ読み込まれますか?

マネージド アセンブリの読み込みをトリガーする最も一般的なメカニズムは、静的アセンブリ参照です。 これらの参照は、コードが別のアセンブリで定義された型を使用するたびにコンパイラによって挿入されます。 これらのアセンブリは、ランタイムによって必要に応じて読み込まれます (load-by-name)。 静的アセンブリ参照が読み込まれる正確なタイミングは指定されていません。 ランタイム バージョンによって異なる場合があり、インライン化などの最適化の影響を受けます。

次の API を直接使用すると、読み込みもトリガーされます。

API(アプリケーション・プログラミング・インターフェース) 説明 Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name このインスタンス。
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
パスから読み込みます。 このインスタンス。
AssemblyLoadContext.LoadFromStream オブジェクトから読み込みます。 このインスタンス。
Assembly.LoadFile 新しい AssemblyLoadContext インスタンスのパスから読み込む 新しい AssemblyLoadContext インスタンス。
Assembly.LoadFrom AssemblyLoadContext.Default インスタンス内のパスから読み込みます。
AppDomain.AssemblyResolve ハンドラーを追加します。 ハンドラーは、そのディレクトリからアセンブリの依存関係を読み込みます。
AssemblyLoadContext.Default のインスタンスです。
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name 呼び出し元に基づいて推測されます。
AssemblyLoadContextメソッドを優先します。
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
新しい AssemblyLoadContext インスタンス内のオブジェクトから読み込みます。 新しい AssemblyLoadContext インスタンス。
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name 呼び出し元に基づいて推測されます。
Type.GetTypeメソッドでassemblyResolver引数を優先的に使用します。
Assembly.GetType name アセンブリ修飾ジェネリック型を記述する場合は、 Load-by-nameをトリガーします。 呼び出し元に基づいて推測されます。
アセンブリ修飾型名を使用する場合は、 Type.GetType を優先します。
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name 呼び出し元に基づいて推測されます。
Activator.CreateInstance引数を取るTypeメソッドを優先します。

アルゴリズム

次のアルゴリズムでは、ランタイムがマネージド アセンブリを読み込む方法について説明します。

  1. active AssemblyLoadContextを決定します。

  2. Load-by-name メソッドの場合、activeAssemblyLoadContextは次の優先順位でアセンブリを読み込みます。

  3. その他の種類の読み込みでは、 activeAssemblyLoadContext は次の優先順位でアセンブリを読み込みます。

    • その cache-by-nameを確認します。
    • 指定したパスまたは生のアセンブリ オブジェクトから読み込みます。 アセンブリが新しく読み込まれると、 activeAssemblyLoadContext インスタンスの cache-by-nameに参照が追加されます。
  4. どちらの場合も、アセンブリが新しく読み込まれた場合は、 AppDomain.AssemblyLoad イベントが発生します。