Partilhar via


bindingFailure MDA

Observação

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

O bindingFailure assistente de depuração gerido (MDA) é ativado quando um conjunto não carrega.

Sintomas

O código tentou carregar um conjunto usando uma referência estática ou um dos métodos do loader, como Assembly.Load ou Assembly.LoadFrom. A montagem não é carregada e uma FileNotFoundException exceção ou FileLoadException é lançada.

Motivo

Ocorre uma falha de ligação quando o tempo de execução não consegue carregar uma montagem. Uma falha de ligação pode resultar de uma das seguintes situações:

  • O runtime da common language (CLR) não consegue encontrar a montagem solicitada. Existem muitas razões para isto acontecer, como o conjunto não estar instalado ou a aplicação não estar corretamente configurada para encontrar o conjunto.

  • Um cenário de problema comum é passar um tipo para outro domínio de aplicação, o que exige que o CLR carregue o assembly que contém esse tipo no outro domínio de aplicação. Pode não ser possível que o tempo de execução carregue o assembly se o outro domínio de aplicação estiver configurado de forma diferente do domínio original. Por exemplo, os dois domínios de aplicação podem ter valores de propriedade diferentes BaseDirectory .

  • A assembleia solicitada está corrompida ou não é uma assembleia.

  • O código que tenta carregar o assembly não tem as permissões corretas de acesso ao código para carregar assemblies.

  • As credenciais de utilizador não fornecem as permissões necessárias para ler o ficheiro.

Resolução

O primeiro passo é determinar porque é que o CLR não conseguiu vincular-se à montagem solicitada. Existem muitas razões pelas quais o tempo de execução pode não ter encontrado ou conseguido carregar a montagem solicitada, como os cenários listados na secção Causa. São recomendadas as seguintes ações para eliminar a causa da falha da ligação:

  • Determine a causa utilizando os dados fornecidos pela bindingFailure MDA:

    • Execute o Fuslogvw.exe (Assembly Binding Log Viewer) para ler os registos de erro produzidos pelo dossier de montagem.

    • Determine se a montagem está no local solicitado. No caso dos LoadFrom métodos e, LoadFile a localização solicitada pode ser facilmente determinada. No caso do Load método, que se liga usando a identidade de assembly, deve procurar assemblies que correspondam a essa identidade no caminho de probe de propriedades do BaseDirectory domínio da aplicação e na cache global de assembly.

  • Resolver a causa com base na determinação anterior. As opções possíveis de resolução são as seguintes:

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

    • Copie o assembly solicitado para o diretório da aplicação e chame o Load método para carregar o assembly por identidade.

    • Reconfigure o domínio de aplicação onde ocorreu a falha da ligação para incluir o caminho de montagem, alterando a BaseDirectory propriedade ou adicionando caminhos privados de sondagem.

    • Altere a lista de controlo de acesso do ficheiro para permitir que o utilizador iniciado leia o ficheiro.

Efeito no tempo de execução

Este MDA não tem efeito no CLR. Só reporta dados sobre falhas de ligação.

Output

A MDA reporta o assembly que falhou ao carregar, incluindo o caminho solicitado e/ou nome de exibição, o contexto de ligação, o domínio da aplicação onde a carga foi solicitada e a razão da falha.

O nome de exibição ou o caminho solicitado pode estar em branco se esses dados não estivessem disponíveis para o CLR. Se a chamada que falhou foi para o Load método, é provável que o tempo de execução não tenha conseguido determinar o nome de exibição para a montagem.

Configuração

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

Exemplo

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

Consulte também