Dela via


bindingFailure MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den bindingFailure hanterade felsökningsassistenten (MDA) aktiveras när en sammansättning inte kan läsas in.

Symtom

Koden har försökt läsa in en sammansättning med hjälp av en statisk referens eller någon av inläsningsmetoderna, till exempel Assembly.Load eller Assembly.LoadFrom. Sammansättningen läses inte in och ett FileNotFoundException undantag FileLoadException genereras.

Orsak

Ett bindningsfel inträffar när körningen inte kan läsa in en sammansättning. Ett bindningsfel kan bero på någon av följande situationer:

  • CLR (Common Language Runtime) kan inte hitta den begärda sammansättningen. Det finns många orsaker till att detta kan inträffa, till exempel att sammansättningen inte installeras eller att programmet inte är korrekt konfigurerat för att hitta sammansättningen.

  • Ett vanligt problemscenario är att skicka en typ till en annan programdomän, vilket kräver att CLR läser in sammansättningen som innehåller den typen i den andra programdomänen. Det kanske inte är möjligt för körningen att läsa in sammansättningen om den andra programdomänen har konfigurerats på ett annat sätt än den ursprungliga programdomänen. De två programdomänerna kan till exempel ha olika BaseDirectory egenskapsvärden.

  • Den begärda sammansättningen är skadad eller är inte en sammansättning.

  • Koden som försöker läsa in sammansättningen har inte rätt säkerhetsbehörighet för kodåtkomst för att läsa in sammansättningar.

  • Användarautentiseringsuppgifterna ger inte de behörigheter som krävs för att läsa filen.

Åtgärd

Det första steget är att avgöra varför CLR inte kunde binda till den begärda sammansättningen. Det finns många orsaker till att körningen kanske inte har hittats eller kunnat läsa in den begärda sammansättningen, till exempel de scenarier som anges i avsnittet Orsak. Följande åtgärder rekommenderas för att eliminera orsaken till bindningsfelet:

  • Fastställa orsaken med hjälp av de data som tillhandahålls av bindingFailure MDA:

    • Kör Fuslogvw.exe (Loggboken för sammansättningsbindning) för att läsa felloggarna som skapas av sammansättningsbindaren.

    • Kontrollera om sammansättningen finns på den begärda platsen. När det gäller LoadFrom metoderna och LoadFile kan den begärda platsen enkelt fastställas. När det gäller metoden, som binder med hjälp av Load sammansättningsidentiteten, måste du leta efter sammansättningar som matchar den identiteten i programdomänens egenskapsavsökningssökväg BaseDirectory och den globala sammansättningscacheminnet.

  • Lös orsaken baserat på föregående bestämning. Möjliga lösningsalternativ är följande:

    • Installera den begärda sammansättningen i den globala sammansättningscacheminnet och anropa. Load metod för att läsa in sammansättningen efter identitet.

    • Kopiera den begärda sammansättningen till programkatalogen Load och anropa metoden för att läsa in sammansättningen efter identitet.

    • Konfigurera om programdomänen där bindningsfelet inträffade för att inkludera sammansättningssökvägen genom att antingen ändra BaseDirectory egenskapen eller lägga till privata sökvägar för avsökning.

    • Ändra åtkomstkontrollistan för filen så att den inloggade användaren kan läsa filen.

Effekt på körningen

Denna MDA har ingen effekt på CLR. Den rapporterar endast data om bindningsfel.

Output

MDA rapporterar sammansättningen som inte kunde läsas in, inklusive den begärda sökvägen och/eller visningsnamnet, bindningskontexten, programdomänen där inläsningen begärdes och orsaken till felet.

Visningsnamnet eller den begärda sökvägen kan vara tom om dessa data inte var tillgängliga för CLR. Om anropet som misslyckades var till Load metoden är det troligt att körningen inte kunde fastställa visningsnamnet för sammansättningen.

Konfiguration

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

Exempel

Följande kodexempel visar en situation som kan aktivera denna 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");
        }
    }
}

Se även