共用方式為


bindingFailure MDA

當組件 (Assembly) 載入失敗時,bindingFailure Managed 偵錯助理 (MDA) 就會啟動。

症狀

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

原因

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

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

  • 常見的問題案例,就是將型別傳遞至另一個應用程式定義域,如此便需要 CLR 在其他應用程式定義域中,載入含有該型別的組件。 如果另一個應用程式定義域的設定,與原始應用程式定義域的設定不同,執行階段就可能無法載入組件。 例如,兩個應用程式定義域可能具有不同的 BaseDirectory 屬性值。

  • 要求的組件已損毀,或者已不是組件。

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

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

解決方式

第一個步驟是判斷 CLR 為何無法繫結至要求的組件。 有很多原因會使執行階段找不到或無法載入要求的組件,例如<原因>一節所列的案例。 建議您進行下列動作以排除繫結失敗的原因:

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

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

    • 判斷組件是否位於要求的位置。 在 LoadFromLoadFile 方法的情況下,都可以輕易地判斷出要求的位置。 在 Load 方法的情況中,由於此方法會使用組件識別 (Identity) 來繫結,因此,您必須在應用程式定義域的 BaseDirectory 屬性探查路徑和全域組件快取中,尋找符合該識別的組件。

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

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

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

    • 藉由變更 BaseDirectory 屬性,或是加入私用探查路徑,重新設定發生繫結失敗的應用程式定義域,以加入組件路徑。

    • 變更檔案的存取控制項清單,以允許登入的使用者讀取檔案。

對執行階段的影響

這個 MDA 對 CLR 無效。 它只會報告有關繫結失敗的資料。

Output

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

請參閱

概念

診斷 Managed 偵錯助理的錯誤