bindingFailure MDA

Asystent bindingFailure zarządzanego debugowania (MDA) jest aktywowany, gdy nie można załadować zestawu.

Objawy

Kod próbował załadować zestaw przy użyciu odwołania statycznego lub jednej z metod modułu ładującego, takich jak Assembly.Load lub Assembly.LoadFrom. Zestaw nie jest ładowany i zgłaszany FileNotFoundException jest wyjątek lub FileLoadException .

Przyczyna

Błąd powiązania występuje, gdy środowisko uruchomieniowe nie może załadować zestawu. Błąd powiązania może być wynikiem jednej z następujących sytuacji:

  • Środowisko uruchomieniowe języka wspólnego (CLR) nie może odnaleźć żądanego zestawu. Istnieje wiele powodów, dla których taka sytuacja może wystąpić, na przykład nie zainstalowano zestawu lub aplikacja nie jest poprawnie skonfigurowana w celu znalezienia zestawu.

  • Typowy scenariusz problemu polega na przekazaniu typu do innej domeny aplikacji, co wymaga, aby CLR załadował zestaw zawierający ten typ w innej domenie aplikacji. Może nie być możliwe załadowanie zestawu przez środowisko uruchomieniowe, jeśli inna domena aplikacji jest skonfigurowana inaczej niż oryginalna domena aplikacji. Na przykład dwie domeny aplikacji mogą mieć różne BaseDirectory wartości właściwości.

  • Żądany zestaw jest uszkodzony lub nie jest zestawem.

  • Kod próbujący załadować zestaw nie ma odpowiednich uprawnień zabezpieczeń dostępu do kodu w celu załadowania zestawów.

  • Poświadczenia użytkownika nie zapewniają wymaganych uprawnień do odczytu pliku.

Rozwiązanie

Pierwszym krokiem jest ustalenie, dlaczego clR nie może powiązać z żądanym zestawem. Istnieje wiele powodów, dla których środowisko uruchomieniowe mogło nie odnaleźć lub nie mogło załadować żądanego zestawu, na przykład scenariusze wymienione w sekcji Przyczyna. Zalecane są następujące akcje, aby wyeliminować przyczynę błędu powiązania:

  • Ustal przyczynę przy użyciu danych dostarczonych przez usługę bindingFailure MDA:

    • Uruchom Fuslogvw.exe (Podgląd dziennika powiązań zestawów), aby odczytać dzienniki błędów wygenerowane przez binder zestawów.

    • Ustal, czy zestaw znajduje się w żądanej lokalizacji. W przypadku LoadFrom metod i LoadFile można łatwo określić żądaną lokalizację. W przypadku metody powiązanej Load przy użyciu tożsamości zestawu należy wyszukać zestawy zgodne z tą tożsamością w ścieżce sondy właściwości domeny BaseDirectory aplikacji i globalnej pamięci podręcznej zestawów.

  • Rozwiąż przyczynę na podstawie powyższej determinacji. Możliwe opcje rozwiązywania są następujące:

    • Zainstaluj żądany zestaw w globalnej pamięci podręcznej zestawów i wywołaj metodę . Load metoda ładowania zestawu według tożsamości.

    • Skopiuj żądany zestaw do katalogu aplikacji i wywołaj metodę Load , aby załadować zestaw według tożsamości.

    • Skonfiguruj ponownie domenę aplikacji, w której wystąpił błąd powiązania, aby uwzględnić ścieżkę zestawu przez zmianę BaseDirectory właściwości lub dodanie prywatnych ścieżek sondowania.

    • Zmień listę kontroli dostępu dla pliku, aby zezwolić zalogowanym użytkownikowi na odczytywanie pliku.

Wpływ na środowisko uruchomieniowe

To MDA nie ma wpływu na CLR. Raportuje tylko dane dotyczące niepowodzeń powiązań.

Dane wyjściowe

Usługa MDA zgłasza zestaw, który nie może załadować, w tym żądaną ścieżkę i/lub nazwę wyświetlaną, kontekst powiązania, domenę aplikacji, w której zażądano obciążenia, oraz przyczynę niepowodzenia.

Nazwa wyświetlana lub żądana ścieżka może być pusta, jeśli te dane nie były dostępne dla środowiska CLR. Jeśli wywołanie, którego nie powiodło się, było Load metodą, prawdopodobnie środowisko uruchomieniowe nie może określić nazwy wyświetlanej zestawu.

Konfigurowanie

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

Przykład

Poniższy przykład kodu przedstawia sytuację, która może aktywować tę usługę 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");
        }
    }
}

Zobacz też