Bagikan melalui


bindingFailure MDA

Nota

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Asisten bindingFailure penelusuran kesalahan terkelola (MDA) diaktifkan ketika perakitan gagal dimuat.

Gejala

Kode telah mencoba memuat rakitan menggunakan referensi statis atau salah satu metode pemuat, seperti Assembly.Load atau Assembly.LoadFrom. Rakitan tidak dimuat dan FileNotFoundException pengecualian atau FileLoadException dilemparkan.

Penyebab

Kegagalan pengikatan terjadi ketika runtime tidak dapat memuat rakitan. Kegagalan pengikatan mungkin merupakan akibat dari salah satu situasi berikut:

  • Runtime bahasa umum (CLR) tidak dapat menemukan rakitan yang diminta. Ada banyak alasan ini dapat terjadi, seperti perakitan tidak diinstal atau aplikasi tidak dikonfigurasi dengan benar untuk menemukan assembly.

  • Skenario masalah umum adalah meneruskan jenis ke domain aplikasi lain, yang mengharuskan CLR memuat rakitan yang berisi jenis tersebut di domain aplikasi lain. Runtime mungkin tidak dapat memuat rakitan jika domain aplikasi lain dikonfigurasi secara berbeda dari domain aplikasi asli. Misalnya, dua domain aplikasi mungkin memiliki nilai properti yang berbeda BaseDirectory .

  • Rakitan yang diminta rusak atau bukan rakitan.

  • Kode yang mencoba memuat rakitan tidak memiliki izin keamanan akses kode yang benar untuk memuat rakitan.

  • Kredensial pengguna tidak memberikan izin yang diperlukan untuk membaca file.

Resolution

Langkah pertama adalah menentukan mengapa CLR tidak dapat mengikat ke rakitan yang diminta. Ada banyak alasan mengapa runtime mungkin tidak menemukan atau dapat memuat rakitan yang diminta, seperti skenario yang tercantum di bagian Penyebab. Tindakan berikut disarankan untuk menghilangkan penyebab kegagalan pengikatan:

  • Tentukan penyebabnya dengan menggunakan data yang disediakan oleh bindingFailure MDA:

    • Jalankan Fuslogvw.exe (Penampil Log Pengikatan Perakitan) untuk membaca log kesalahan yang dihasilkan oleh pengikat rakitan.

    • Tentukan apakah assembly berada di lokasi yang diminta. Dalam kasus LoadFrom metode dan LoadFile , lokasi yang diminta dapat dengan mudah ditentukan. Dalam kasus Load metode , yang mengikat menggunakan identitas perakitan, Anda harus mencari rakitan yang cocok dengan identitas tersebut di jalur pemeriksaan properti domain BaseDirectory aplikasi dan cache perakitan global.

  • Atasi penyebabnya berdasarkan penentuan sebelumnya. Opsi resolusi yang mungkin adalah sebagai berikut:

    • Instal rakitan yang diminta di cache perakitan global dan panggil. Load metode untuk memuat rakitan berdasarkan identitas.

    • Salin rakitan yang diminta ke direktori aplikasi dan panggil Load metode untuk memuat rakitan berdasarkan identitas.

    • Konfigurasi ulang domain aplikasi tempat kegagalan pengikatan terjadi untuk menyertakan jalur perakitan dengan mengubah BaseDirectory properti atau menambahkan jalur pemeriksaan privat.

    • Ubah daftar kontrol akses untuk file agar pengguna yang masuk dapat membaca file.

Efek pada Runtime

MDA ini tidak berpengaruh pada CLR. Ini hanya melaporkan data tentang kegagalan pengikatan.

Hasil

MDA melaporkan rakitan yang gagal dimuat, termasuk jalur yang diminta dan/atau nama tampilan, konteks pengikatan, domain aplikasi tempat beban diminta, dan alasan kegagalan.

Nama tampilan atau jalur yang diminta mungkin kosong jika data tersebut tidak tersedia untuk CLR. Jika panggilan yang gagal adalah ke Load metode , kemungkinan runtime tidak dapat menentukan nama tampilan untuk rakitan.

Konfigurasi

<mdaConfig>
  <assistants>
    <bindingFailure />
  </assistants>
</mdaConfig>

Example

Contoh kode berikut menunjukkan situasi yang dapat mengaktifkan MDA ini:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // This call attempts to load a nonexistent assembly.
            // The call will throw a System.IO.FileNotFound exception
            // and cause the activation of the bindingFailure MDA
            // if it is registered.
            Assembly.Load("NonExistentAssembly");
        }
    }
}

Baca juga