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

マネージド アセンブリは、さまざまな段階を伴うアルゴリズムを使用して検出され、読み込まれます。

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

マネージド アセンブリが読み込まれるタイミング

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

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

API 説明 Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name this インスタンス
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
パスから読み込みます。 this インスタンス
AssemblyLoadContext.LoadFromStream オブジェクトから読み込みます。 this インスタンス
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. 呼び出し元から推論されます。
assemblyResolver 引数を使用した Type.GetType メソッドが優先されます。
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. 呼び出し元から推論されます。
Type 引数を取る Activator.CreateInstance メソッドが優先されます。

アルゴリズム

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

  1. activeAssemblyLoadContext を決定します。

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

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

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