Compartilhar via


MDA bindingFailure

Observação

Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O MDA (assistente para depuração gerenciada) bindingFailure é ativado quando um assembly falha ao ser carregado.

Sintomas

O código tentou carregar um assembly usando uma referência estática ou um dos métodos de carregador, como Assembly.Load ou Assembly.LoadFrom. O assembly não foi carregado e uma exceção FileNotFoundException ou FileLoadException é gerada.

Causa

Uma falha de associação ocorre quando o runtime não pode carregar um assembly. Uma falha de associação pode ser o resultado de uma das seguintes situações:

  • O CLR (Common Language Runtime) não pode localizar o assembly solicitado. Há muitos motivos para que isso ocorra, como o assembly não está sendo instalado ou o aplicativo não está sendo configurado corretamente para localizar o assembly.

  • Um cenário comum de problema é a passagem de um tipo para outro domínio do aplicativo, que exige que o CLR carregue o assembly que contém esse tipo no outro domínio do aplicativo. Talvez não seja possível que o runtime carregue o assembly se o domínio do aplicativo estiver configurado de maneira diferente do domínio do aplicativo original. Por exemplo, os dois domínios do aplicativo podem ter valores de propriedade BaseDirectory diferentes.

  • O assembly solicitado está corrompido ou não é um assembly.

  • O código que está tentando carregar o assembly não tem as permissões corretas de segurança de acesso do código para carregar assemblies.

  • As credenciais do usuário não fornecem as permissões necessárias para ler o arquivo.

Resolução

A primeira etapa é determinar por que o CLR não pôde ser associado ao assembly solicitado. Há muitas razões pelas quais o runtime pode não ter encontrado ou não pôde carregar o assembly solicitado, como os cenários listados na seção Causa. As seguintes ações são recomendadas para eliminar a causa da falha de associação:

  • Determine a causa usando os dados fornecidos pelo MDA bindingFailure:

    • Execute o Fuslogvw.exe (Visualizador de Log de Associação do Assembly) para ler os logs de erro produzidos pelo associador do assembly.

    • Determine se o assembly está no local solicitado. No caso dos métodos LoadFrom e LoadFile, o local solicitado pode ser determinado com facilidade. No caso do método Load, que é associado usando a identidade do assembly, você deve procurar assemblies que correspondem à identidade no caminho de investigação da propriedade BaseDirectory do domínio do aplicativo e no cache de assembly global.

  • Resolva a causa conforme a determinação anterior. As possíveis opções de resolução são as seguintes:

    • Instale o assembly solicitado no cache de assembly global e chame o método Load para carregar o assembly por identidade.

    • Copie o assembly solicitado para o diretório do aplicativo e chame o método Load para carregar o assembly por identidade.

    • Reconfigure o domínio do aplicativo no qual ocorreu a falha de associação para incluir o caminho do assembly alterando a propriedade BaseDirectory ou adicionando caminhos de investigação particulares.

    • Altere a lista de controle de acesso do arquivo para permitir que o usuário conectado leia o arquivo.

Efeito sobre o runtime

Esse MDA não tem efeito sobre o CLR. Ele relata apenas os dados sobre falhas de associação.

Saída

O MDA relata o assembly que falhou ao ser carregado, incluindo o caminho solicitado e/ou nome de exibição, o contexto de associação, o domínio do aplicativo no qual a carga foi solicitada e o motivo da falha.

O nome de exibição ou o caminho solicitado pode ficar em branco se esses dados não estavam disponíveis para o CLR. Se a chamada que falhou era para o método Load, é provável que o runtime não pôde determinar o nome de exibição do assembly.

Configuração

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

Exemplo

O seguinte exemplo de código demonstra uma situação que pode ativar esse 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");
        }
    }
}

Confira também