bindingFailure MDA
注意
本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。
無法載入組件時,會啟用 bindingFailure
Managed 偵錯助理 (MDA)。
徵兆
程式碼已嘗試使用靜態參考或其中一個載入器方法 (例如 Assembly.Load 或 Assembly.LoadFrom) 載入組件。 未載入組件,並擲回 FileNotFoundException 或 FileLoadException 例外狀況。
原因
執行階段無法載入組件時,發生繫結失敗。 繫結失敗可能是下列其中一個情況所造成:
Common Language Runtime (CLR) 找不到要求的組件。 有許多原因可能會發生這種情況,例如未安裝組件,或應用程式未正確地設定成尋找組件。
常見問題案例是將類型傳遞給另一個應用程式定義域,而這需要 CLR 在另一個應用程式定義域中載入包含該類型的組件。 如果另一個應用程式定義域與原始應用程式定義域的設定方式不同,則執行階段可能無法載入組件。 例如,兩個應用程式定義域可能會有不同的 BaseDirectory 屬性值。
所要求的組件損毀或不是組件。
嘗試載入組件的程式碼沒有載入組件的正確程式碼存取安全性權限。
使用者認證未提供讀取檔案的必要權限。
解決方法
第一個步驟是判斷 CLR 為什麼無法繫結至所要求的組件。 有許多原因會找不到執行階段或無法載入所要求的組件,例如 [原因] 區段中列出的案例。 若要消除繫結失敗的原因,建議使用下列動作:
使用
bindingFailure
MDA 所提供的資料,來判斷原因:執行 Fuslogvw.exe (組件繫結記錄檔檢視器),以讀取組件繫結器所產生的錯誤記錄檔。
判斷組件是否位於要求的位置。 如果是 LoadFrom 和 LoadFile 方法,則可以輕鬆地判斷所要求的位置。 如果是使用組件身分識別繫結的 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");
}
}
}