Bagikan melalui


Pemeriksaan default

Instans AssemblyLoadContext.Default bertanggung jawab untuk menemukan ketergantungan pada perakitan. Artikel ini menjelaskan logika pemeriksaan instans AssemblyLoadContext.Default .

Properti pengawasan yang dikonfigurasi oleh host

Pada saat runtime dimulai, host runtime menyediakan sekumpulan properti pengujian bernama yang mengonfigurasi jalur pengujian AssemblyLoadContext.Default.

Setiap properti pengujian bersifat opsional. Jika ada, setiap properti adalah nilai string yang berisi daftar jalur absolut yang dibatasi. Pembatasnya adalah ';' pada Windows dan ':' di semua platform lainnya.

Nama Properti Description
TRUSTED_PLATFORM_ASSEMBLIES Daftar jalur file perakitan platform dan aplikasi.
PLATFORM_RESOURCE_ROOTS Daftar jalur direktori untuk mencari rakitan sumber daya satelit.
NATIVE_DLL_SEARCH_DIRECTORIES Daftar jalur direktori untuk mencari pustaka yang tidak dikelola (asli).
APP_PATHS Daftar jalur direktori untuk mencari rakitan perangkat lunak yang dikelola.

Bagaimana properti terisi?

Ada dua skenario utama untuk mengisi properti tergantung pada apakah <file myapp>.deps.json ada.

  • Saat file *.deps.json ada, file tersebut diparsing untuk mengisi properti probing.
  • Ketika file *.deps.json tidak ada, direktori aplikasi diasumsikan berisi semua dependensi. Isi direktori digunakan untuk mengisi properti pendeteksian.

Selain itu, file *.deps.json untuk kerangka kerja yang direferensikan juga diurai.

Variabel DOTNET_ADDITIONAL_DEPS lingkungan dapat digunakan untuk menambahkan dependensi tambahan. dotnet.exe juga berisi parameter opsional --additional-deps untuk mengatur nilai ini pada startup aplikasi.

Nota

Variabel DOTNET_ADDITIONAL_DEPS lingkungan dan --additional-deps opsi baris perintah hanya berlaku untuk aplikasi yang bergantung pada kerangka kerja. Opsi ini diabaikan untuk aplikasi mandiri. Untuk informasi selengkapnya, lihat Penyebaran yang bergantung pada kerangka kerja vs mandiri.

Properti APP_PATHS tidak diisi secara default dan dihilangkan untuk sebagian besar aplikasi.

Daftar semua file *.deps.json yang digunakan oleh aplikasi dapat diakses melalui System.AppContext.GetData("APP_CONTEXT_DEPS_FILES").

Bagaimana cara melihat properti probing dari kode terkelola?

Setiap properti tersedia dengan memanggil AppContext.GetData(String) fungsi dengan nama properti dari tabel di atas.

Bagaimana cara melacak kesalahan dalam pembuatan properti pemeriksaan?

Host runtime .NET Core akan menghasilkan pesan pelacakan yang berguna ketika variabel lingkungan tertentu diaktifkan:

Variabel lingkungan Description
DOTNET_HOST_TRACE=1 Memungkinkan pelacakan.
DOTNET_HOST_TRACEFILE=<path> Melacak ke jalur file alih-alih default stderr.
DOTNET_HOST_TRACE_VERBOSITY Mengatur verbositas dari 1 (terendah) ke 4 (tertinggi).

Untuk informasi selengkapnya, lihat DOTNET_HOST_TRACE variabel lingkungan.

Pemeriksaan default rakitan terkelola

Saat menyelidiki untuk menemukan rakitan terkelola, AssemblyLoadContext.Default melihat dalam urutan:

  • File yang cocok dengan AssemblyName.Name di TRUSTED_PLATFORM_ASSEMBLIES (setelah menghapus ekstensi file).
  • Berkas-berkas yang disusun di APP_PATHS memiliki ekstensi file umum.

Saat memuat AssemblyLoadContext secara default, rakitan yang ditemukan di TRUSTED_PLATFORM_ASSEMBLIES atau APP_PATHS akan diutamakan daripada jalur tertentu atau objek rakitan mentah. Misalnya, jika Anda memanggil AssemblyLoadContext.LoadFromStream atau AssemblyLoadContext.LoadFromAssemblyPath pada AssemblyLoadContext default dan ada rakitan dengan nama yang cocok di TRUSTED_PLATFORM_ASSEMBLIES atau APP_PATHS, runtime memuat rakitan dari lokasi tersebut, bukan dari aliran atau jalur APP_PATHS yang ditentukan.

Pemeriksaan rakitan satelit (sumber daya)

Untuk menemukan rakitan satelit untuk budaya tertentu, buat serangkaian jalur file.

Untuk setiap jalur dalam PLATFORM_RESOURCE_ROOTS dan kemudian APP_PATHS, tambahkan CultureInfo.Name string, pemisah direktori, AssemblyName.Name string, dan ekstensi '.dll'.

Jika ada file yang cocok, coba muat dan kembalikan.

Pengecekan pustaka bawaan yang tidak terkelola

Algoritma penelusuran pustaka yang tidak dikelola dari runtime sama di semua platform. Namun, karena pemuatan sebenarnya pustaka yang tidak dikelola dilakukan oleh platform yang mendasari, perilaku yang diamati mungkin sedikit berbeda.

  1. Periksa apakah nama pustaka yang disediakan mewakili jalur absolut atau relatif.

  2. Jika nama mewakili jalur absolut, gunakan nama secara langsung untuk semua operasi berikutnya. Jika tidak, gunakan nama dan buat kombinasi yang ditentukan oleh platform untuk dipertimbangkan. Kombinasi terdiri dari awalan spesifik platform (misalnya, lib) dan/atau akhiran (misalnya, , .dll.dylib, dan .so). Ini bukan daftar lengkap, dan tidak mewakili upaya yang tepat yang dilakukan pada setiap platform. Ini hanya contoh dari apa yang dipertimbangkan. Untuk informasi selengkapnya, lihat pemuatan pustaka asli.

  3. Nama dan, jika jalurnya relatif, setiap kombinasi tersebut digunakan dalam langkah-langkah berikut. Upaya pemuatan pertama yang berhasil akan langsung mengembalikan pegangan ke perpustakaan yang telah dimuat.

    • Tambahkan ke setiap jalur yang diberikan dalam properti NATIVE_DLL_SEARCH_DIRECTORIES dan coba untuk memuat.

    • Jika DefaultDllImportSearchPathsAttribute tidak didefinisikan pada assembly pemanggil atau p/invoke atau didefinisikan dan termasuk DllImportSearchPath.AssemblyDirectory, tambahkan nama atau kombinasi tersebut ke direktori assembly pemanggil dan coba lakukan pemuatan.

    • Gunakan secara langsung untuk memuat pustaka.

  4. Menunjukkan bahwa pustaka gagal dimuat.