bindingFailure-MDA

Der bindingFailure-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn das Laden einer Assembly fehlschlägt.

Symptome

Es wurde versucht, eine Assembly mithilfe eines statischen Verweises oder einer der Ladeprogrammmethoden wie Assembly.Load oder Assembly.LoadFrom zu laden. Die Assembly wird nicht geladen, und es wird eine FileNotFoundException- bzw. FileLoadException-Ausnahme ausgelöst.

Ursache

Ein Bindungsfehler tritt auf, wenn eine Assembly nicht durch die Common Language Runtime geladen werden kann. Ein Bindungsfehler kann das Ergebnis einer der folgenden Situationen sein:

  • Die Common Language Runtime (CLR) kann die angeforderte Assembly nicht finden. Es gibt viele Ursachen dafür. Beispielsweise ist die Assembly nicht installiert, oder die Anwendung wurde nicht ordnungsgemäß zum Finden der Assembly konfiguriert.

  • Häufig treten Probleme beim Übergeben eines Typs an eine andere Anwendungsdomäne auf. Dazu muss die CLR die Assembly mit diesem Typ in die andere Anwendungsdomäne laden. Wenn die andere Anwendungsdomäne anders konfiguriert ist als die ursprüngliche Anwendungsdomäne, kann die CLR die Assembly unter Umständen nicht laden. Zum Beispiel verfügen die beiden Anwendungsdomänen möglicherweise über unterschiedliche BaseDirectory-Eigenschaftswerte.

  • Die angeforderte Assembly ist beschädigt, oder es handelt sich nicht um eine Assembly.

  • Der Programmcode, der die Assembly zu laden versucht, verfügt nicht über die richtigen Sicherheitsberechtigungen für den Codezugriff zum Laden von Assemblys.

  • Den Benutzeranmeldeinformationen sind nicht die erforderlichen Berechtigungen zum Lesen der Datei zugeordnet.

Lösung

Der erste Schritt ist zu ermitteln, warum die CLR keine Bindung der angeforderten Assembly durchführen konnte. Es gibt viele Ursachen, warum die CLR die angeforderte Assembly nicht gefunden hat bzw. nicht laden konnte (siehe die im Abschnitt „Ursache“ aufgeführten Szenarios). Die folgenden Aktionen werden empfohlen, um die Ursache des Bindungsfehlers zu ermitteln:

  • Bestimmen Sie die Ursache, indem Sie die vom bindingFailure-MDA bereitgestellten Daten auswerten:

    • Starten Sie Fuslogvw.exe (Assembly Binding Log Viewer), um die bei der Assemblybindung erzeugten Fehlerprotokolle anzuzeigen.

    • Stellen Sie fest, ob sich die Assembly am angegebenen Speicherort befindet. Im Fall der LoadFrom- und LoadFile-Methoden kann der angeforderte Speicherort leicht ermittelt werden. Im Fall der Load-Methode, bei der die Bindung mithilfe der Assemblyidentität erfolgt, müssen Sie nach Assemblys mit dieser Identität in der Überprüfungspfadeigenschaft BaseDirectory der Anwendungsdomäne und im globalen Assemblycache suchen.

  • Beheben Sie die Fehlerursache in Abhängigkeit vom Ergebnis der Ursachensuche. Mögliche Vorgehensweisen zum Lösen des Problems:

    • Installieren Sie die angeforderte Assembly im globalen Assemblycache, und rufen Sie die Load-Methode, um die Assembly nach Identität zu laden.

    • Kopieren Sie die angeforderte Assembly in das Anwendungsverzeichnis, und rufen Sie die Load-Methode auf, um die Assembly nach Identität zu laden.

    • Konfigurieren Sie die Anwendungsdomäne mit dem Bindungsfehler so um, dass sie den Pfad zur Assembly enthält. Ändern Sie dazu entweder die BaseDirectory-Eigenschaft, oder fügen Sie private Überprüfungspfade hinzu.

    • Ändern Sie die Zugriffssteuerungsliste der Datei, damit diese vom angemeldeten Benutzer gelesen werden kann.

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die CLR. Es werden nur Daten über Bindungsfehler bereitgestellt.

Ausgabe

Der MDA meldet die Assembly, die nicht geladen wurde, den angeforderten Pfad und/oder den Anzeigenamen, den Bindungskontext, die Anwendungsdomäne für den angeforderten Ladevorgang und die Fehlerursache.

Die Angaben zu Anzeigename oder angefordertem Pfad sind möglicherweise leer, wenn diese Daten der CLR nicht zur Verfügung standen. Wenn der fehlgeschlagene Aufruf ein Aufruf der Load-Methode war, konnte die CLR wahrscheinlich den Anzeigenamen der Assembly nicht ermitteln.

Konfiguration

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

Beispiel

Im folgenden Codebeispiel wird eine Situation veranschaulicht, die zum Aktivieren dieses MDA führen kann:

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

Weitere Informationen