Bagikan melalui


Algoritma penyusunan perakitan yang terkelola dengan baik

Assembly terkelola ditempatkan dan dimuat menggunakan algoritma yang memiliki berbagai tahapan.

Semua rakitan terkelola kecuali rakitan satelit dan rakitan WinRT 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 waktu proses. 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:

Antarmuka Pemrograman Aplikasi (API) Deskripsi Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Instans ini.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Muat dari path. 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 lokasi dalam instans AssemblyLoadContext.Default.
Menambahkan handler AppDomain.AssemblyResolve . Pengelola akan melakukan pemuatan ketergantungan rakitan dari direktori miliknya.
Instans AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Disimpulkan dari penelepon.
Preferensi pada metode AssemblyLoadContext.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Muat dari objek ke instans baru AssemblyLoadContext. Instans baru AssemblyLoadContext.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Disimpulkan dari penelepon.
Gunakanlah metode Type.GetType dengan argumen assemblyResolver.
Assembly.GetType Jika tipe name menggambarkan tipe generik yang memenuhi syarat di assembly, picu Load-by-name. Disimpulkan dari penelepon.
Utamakan Type.GetType saat menggunakan nama tipe 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. Untuk metode Load-by-name, activeAssemblyLoadContext memuat rakitan dalam urutan prioritas berikut:

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

    • Periksa cache-by-name nya.
    • 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.