共用方式為


bindingFailure MDA

注意

本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。

無法載入組件時,會啟用 bindingFailure Managed 偵錯助理 (MDA)。

徵兆

程式碼已嘗試使用靜態參考或其中一個載入器方法 (例如 Assembly.LoadAssembly.LoadFrom) 載入組件。 未載入組件,並擲回 FileNotFoundExceptionFileLoadException 例外狀況。

原因

執行階段無法載入組件時,發生繫結失敗。 繫結失敗可能是下列其中一個情況所造成:

  • Common Language Runtime (CLR) 找不到要求的組件。 有許多原因可能會發生這種情況,例如未安裝組件,或應用程式未正確地設定成尋找組件。

  • 常見問題案例是將類型傳遞給另一個應用程式定義域,而這需要 CLR 在另一個應用程式定義域中載入包含該類型的組件。 如果另一個應用程式定義域與原始應用程式定義域的設定方式不同,則執行階段可能無法載入組件。 例如,兩個應用程式定義域可能會有不同的 BaseDirectory 屬性值。

  • 所要求的組件損毀或不是組件。

  • 嘗試載入組件的程式碼沒有載入組件的正確程式碼存取安全性權限。

  • 使用者認證未提供讀取檔案的必要權限。

解決方法

第一個步驟是判斷 CLR 為什麼無法繫結至所要求的組件。 有許多原因會找不到執行階段或無法載入所要求的組件,例如 [原因] 區段中列出的案例。 若要消除繫結失敗的原因,建議使用下列動作:

  • 使用 bindingFailure MDA 所提供的資料,來判斷原因:

    • 執行 Fuslogvw.exe (組件繫結記錄檔檢視器),以讀取組件繫結器所產生的錯誤記錄檔。

    • 判斷組件是否位於要求的位置。 如果是 LoadFromLoadFile 方法,則可以輕鬆地判斷所要求的位置。 如果是使用組件身分識別繫結的 Load 方法,則您必須尋找符合應用程式定義域之 BaseDirectory 屬性探查路徑和全域組件快取中該身分識別的組件。

  • 根據先前的判斷來解決原因。 可能的解決方式選項如下:

    • 在全域組件快取中安裝所要求的組件,並呼叫 Load 方法,依身分識別載入組件。

    • 將所要求的組件複製至應用程式目錄,並呼叫 Load 方法,依身分識別載入組件。

    • 變更 BaseDirectory 屬性,或新增私用探查路徑,以重新設定發生繫結失敗的應用程式定義域,來包含組件路徑。

    • 變更檔案的存取控制清單,讓已登入的使用者讀取檔案。

對執行階段的影響

此 MDA 對 CLR 沒有影響。 它只會回報繫結失敗的資料。

輸出

MDA 回報無法載入的組件,包含要求的路徑和 (或) 顯示名稱、繫結內容、在其中要求載入的應用程式定義域,以及失敗原因。

如果該資料無法用於 CLR,則顯示名稱或所要求的路徑可能空白。 如果失敗的呼叫是 Load 方法,則執行階段可能無法判斷組件的顯示名稱。

組態

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

範例

下列程式碼範例示範可啟用此 MDA 的情況:

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");
        }
    }
}

另請參閱