bindingFailure MDA
Uwaga
Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.
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 statycznego odwołania lub jednej z metod modułu ładującego, takich jak Assembly.Load lub Assembly.LoadFrom. Zestaw nie jest ładowany i FileNotFoundException zgłaszany jest wyjątek lub FileLoadException .
Przyczyna
Błąd powiązania występuje, gdy środowisko uruchomieniowe nie może załadować zestawu. Niepowodzenie 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. Może to wystąpić z wielu powodów, takich jak 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 mogło załadować żądany zestaw, 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 generowane przez binder zestawu.
Ustal, czy zestaw znajduje się w żądanej lokalizacji. W przypadku LoadFrom metod i LoadFile można łatwo określić żądaną lokalizację. W przypadku Load metody, która wiąże się 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, zmieniając BaseDirectory właściwość lub dodając prywatne ścieżki sondowania.
Zmień listę kontroli dostępu dla pliku, aby zezwolić zalogowanym użytkownikowi na odczytywanie pliku.
Wpływ na środowisko uruchomieniowe
Ta usługa MDA nie ma wpływu na CLR. Raportuje tylko dane dotyczące błędów powiązań.
Wyjście
MdA zgłasza zestaw, który nie mógł 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óre nie powiodło się, dotyczy Load metody, prawdopodobnie środowisko uruchomieniowe nie może określić nazwy wyświetlanej zestawu.
Konfigurowanie
<mdaConfig>
<assistants>
<bindingFailure />
</assistants>
</mdaConfig>
Przykład
W poniższym przykładzie kodu pokazano 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");
}
}
}