Algoritma pemuatan perakitan terkelola

Rakitan terkelola terletak dan dimuat dengan algoritma yang memiliki berbagai tahapan.

Semua rakitan terkelola kecuali rakitan dan WinRT rakitan satelit menggunakan algoritma yang sama.

Kapan rakitan terkelola dimuat?

Mekanisme paling umum untuk memicu beban rakitan terkelola adalah referensi perakitan statis. Referensi ini disisipkan oleh pengkompilasi setiap kali kode menggunakan jenis yang ditentukan dalam rakitan lain. Rakitan ini dimuat (load-by-name) sesuai kebutuhan oleh runtime. Waktu yang tepat ketika referensi rakitan statis dimuat tidak ditentukan. Ini dapat bervariasi di antara versi runtime dan dipengaruhi oleh pengoptimalan seperti inlining.

Penggunaan langsung API berikut juga akan memicu beban:

API Deskripsi Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Instans ini .
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Muat dari jalur. Instans ini .
AssemblyLoadContext.LoadFromStream Muat dari objek. Instans ini .
Assembly.LoadFile Memuat dari jalur dalam instans baru AssemblyLoadContext Instans baru AssemblyLoadContext .
Assembly.LoadFrom Muat dari jalur dalam AssemblyLoadContext.Default instans.
Menambahkan handler AppDomain.AssemblyResolve . Handler akan memuat dependensi assembly dari direktorinya.
Instans AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Disimpulkan dari penelepon.
Lebih suka AssemblyLoadContext metode.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Muat dari objek dalam instans baru AssemblyLoadContext . Instans baru AssemblyLoadContext .
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Disimpulkan dari penelepon.
Lebih suka Type.GetType metode dengan assemblyResolver argumen.
Assembly.GetType Jika jenis name menjelaskan jenis generik assembly yang memenuhi syarat, picu Load-by-name. Disimpulkan dari penelepon.
Lebih suka Type.GetType saat menggunakan nama jenis yang memenuhi syarat rakitan.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Disimpulkan dari penelepon.
Lebih suka Activator.CreateInstance metode mengambil Type argumen.

Algoritma

Algoritma berikut menjelaskan bagaimana runtime memuat rakitan terkelola.

  1. Tentukan activeAssemblyLoadContext.

  2. Load-by-name Untuk metode , activeAssemblyLoadContext memuat rakitan dalam urutan prioritas berikut:

  3. Untuk jenis beban lainnya, activeAssemblyLoadContext memuat rakitan dalam urutan prioritas berikut:

    • cache-by-namePeriksa .
    • Muat dari jalur yang ditentukan atau objek perakitan mentah. Jika rakitan baru dimuat, referensi ditambahkan ke activeAssemblyLoadContext instans cache-by-name.
  4. Dalam kedua kasus, jika rakitan baru dimuat, maka AppDomain.AssemblyLoad peristiwa akan dinaikkan.