bindingFailure MDA
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De bindingFailure
beheerde foutopsporingsassistent (MDA) wordt geactiveerd wanneer een assembly niet kan worden geladen.
Symptomen
Code heeft geprobeerd een assembly te laden met behulp van een statische verwijzing of een van de laadprogrammamethoden, zoals Assembly.Load of Assembly.LoadFrom. De assembly wordt niet geladen en er wordt een FileNotFoundException of FileLoadException uitzondering gegenereerd.
Oorzaak
Er treedt een bindingsfout op wanneer de runtime een assembly niet kan laden. Een bindingsfout kan het gevolg zijn van een van de volgende situaties:
De common language runtime (CLR) kan de aangevraagde assembly niet vinden. Er zijn veel redenen waarom dit kan gebeuren, zoals dat de assembly niet wordt geïnstalleerd of dat de toepassing niet correct is geconfigureerd om de assembly te vinden.
Een veelvoorkomend probleemscenario is het doorgeven van een type aan een ander toepassingsdomein. Hiervoor moet de CLR de assembly laden die dat type bevat in het andere toepassingsdomein. Het is mogelijk dat de runtime de assembly niet kan laden als het andere toepassingsdomein anders is geconfigureerd dan het oorspronkelijke toepassingsdomein. De twee toepassingsdomeinen kunnen bijvoorbeeld verschillende BaseDirectory eigenschapswaarden hebben.
De aangevraagde assembly is beschadigd of is geen assembly.
De code die de assembly probeert te laden, beschikt niet over de juiste beveiligingsmachtigingen voor codetoegang om assembly's te laden.
De gebruikersreferenties bieden niet de vereiste machtigingen om het bestand te lezen.
Oplossing
De eerste stap is om te bepalen waarom de CLR niet kan binden aan de aangevraagde assembly. Er zijn veel redenen waarom de runtime de aangevraagde assembly mogelijk niet heeft gevonden of geladen, zoals de scenario's die worden vermeld in de sectie Oorzaak. De volgende acties worden aanbevolen om de oorzaak van de bindingsfout te elimineren:
Bepaal de oorzaak met behulp van de gegevens van de
bindingFailure
MDA:Voer de Fuslogvw.exe (Assembly Binding Log Viewer) uit om de foutenlogboeken te lezen die door de assembly-binder worden geproduceerd.
Bepaal of de assembly zich op de aangevraagde locatie bevindt. In het geval van de LoadFrom en LoadFile methoden kan de aangevraagde locatie eenvoudig worden bepaald. In het geval van de Load methode, die verbindt met behulp van de assembly-identiteit, moet u zoeken naar assembly's die overeenkomen met die identiteit in het testpad voor eigenschappen van het toepassingsdomein BaseDirectory en de globale assemblycache.
Los de oorzaak op basis van de voorgaande bepaling op. Mogelijke oplossingsopties zijn:
Installeer de aangevraagde assembly in de globale assemblycache en roep de aan. Load methode voor het laden van de assembly op identiteit.
Kopieer de aangevraagde assembly naar de toepassingsmap en roep de Load methode aan om de assembly per identiteit te laden.
Configureer het toepassingsdomein waarin de bindingsfout is opgetreden om het assemblypad op te nemen opnieuw door de BaseDirectory eigenschap te wijzigen of privéprobingpaden toe te voegen.
Wijzig de toegangsbeheerlijst voor het bestand zodat de aangemelde gebruiker het bestand kan lezen.
Effect op de runtime
Deze MDA heeft geen effect op de CLR. Er worden alleen gegevens over bindingsfouten gerapporteerd.
Uitvoer
De MDA rapporteert de assembly die niet kan worden geladen, inclusief het aangevraagde pad en/of de weergavenaam, de bindingscontext, het toepassingsdomein waarin de belasting is aangevraagd en de reden voor de fout.
De weergavenaam of het aangevraagde pad is mogelijk leeg als die gegevens niet beschikbaar waren voor de CLR. Als de aanroep die is mislukt, is de Load methode waarschijnlijk niet bepaald door de runtime om de weergavenaam voor de assembly te bepalen.
Configuratie
<mdaConfig>
<assistants>
<bindingFailure />
</assistants>
</mdaConfig>
Opmerking
In het volgende codevoorbeeld ziet u een situatie waarin deze MDA kan worden geactiveerd:
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");
}
}
}