bindingFailure MDA
Примечание.
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник по отладке управляемого кода (MDA) bindingFailure
запускается в случае сбоя при загрузке сборки.
Симптомы
Код попытался загрузить сборку с использованием статической ссылки или одного из методов загрузчика, такого как Assembly.Load или Assembly.LoadFrom. Сборка не загружается, в результате чего возникает исключение FileNotFoundException или FileLoadException.
Причина
Если среде выполнения не удается загрузить сборку, происходит сбой привязки. Сбой привязки может возникать в одной из следующих ситуаций:
Общеязыковой среде выполнения (CLR) не удается найти запрошенную сборку. Это может быть вызвано самыми разными причинами, например отсутствием установленной сборки или некорректной конфигурацией поиска сборок в приложении.
Типичный сценарий возникновения проблемы связан с передачей типа в другой домен приложения, которому требуется среда CLR для загрузки сборки, содержащей этот тип, в другом домене приложения. Если конфигурация другого домена приложения отличается от исходного, при загрузке сборки среда выполнения может столкнуться с ошибкой. Например, в этих двух доменах приложений могут быть установлены разные значения свойства BaseDirectory.
Запрошенная сборка повреждена или не является сборкой.
Код, который пытается загрузить сборку, не имеет разрешений на управление доступом для кода, необходимых для загрузки сборок.
Учетные данные пользователя не предоставляют разрешений, необходимых для чтения файла.
Разрешение
В первую очередь необходимо определить причины, по которым среде CLR не удается выполнить привязку к запрошенной сборке. Существует много различных причин, по которым среде выполнения не удается найти или загрузить запрошенную сборку. Некоторые из них перечислены в разделе "Причина". Чтобы устранить причину сбоя привязки, рекомендуется выполнить следующие действия:
Определите причину, используя данные, предоставленные помощником по отладке управляемого кода
bindingFailure
:Запустите программу Fuslogvw.exe (средство просмотра журнала привязки сборок) для чтения журналов ошибок, создаваемых средством привязки сборок.
Определите, находится ли запрошенная сборка в указанном месте. В случае методов LoadFrom и LoadFile запрошенное расположение можно легко определить. При использовании метода Load, который осуществляет привязку по удостоверению сборки, необходимо определить сборки, соответствующие этому удостоверению, в пути пробы свойства BaseDirectory домена приложений и глобальном кэше сборок.
Устраните выявленные ранее причины. Возможны следующие варианты решения проблемы:
Установите запрошенную сборку в глобальный кэш сборок и вызовите метод Load для загрузки сборки по удостоверению.
Скопируйте запрошенную сборку в каталог приложения и вызовите метод Load для загрузки сборки по удостоверению.
Измените конфигурацию домена приложения, в котором произошел сбой привязки, включив в нее путь к сборке. Для этого измените значение свойства BaseDirectory или добавьте частные пути пробы.
Измените список управления доступом и разрешите чтение файла для выполнивших вход пользователей.
Влияние на среду выполнения
Этот помощник отладки управляемого кода не оказывает никакого влияния на среду CLR. Он только создает отчеты о сбоях привязки.
Выходные данные
Этот помощник по отладке управляемого кода создает отчет о сбое при загрузке сборок, в который включаются запрошенный путь и (или) отображаемое имя, контекст привязки, домен приложения, в котором была запрошена загрузка, а также причина сбоя.
Если среде CLR недоступны соответствующие данные, отображаемое имя и запрошенный путь могут быть пустыми. Если сбоем завершается вызов метода Load, чаще всего среде выполнения не удается определить отображаемое имя сборки.
Настройка
<mdaConfig>
<assistants>
<bindingFailure />
</assistants>
</mdaConfig>
Пример
В следующем примере кода показана ситуация, которая может привести к запуску помощника по отладке управляемого кода:
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");
}
}
}