PROBLEMA: Mensagem de erro "FileLoadException" quando o tempo de execução .NET pesquisas para assemblies usando a marca de probing do arquivo de configuração do aplicativo

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 821626
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Suponha o seguinte:
  • Um aplicativo faz referência a um assembly.
  • O assembly tem várias versões.
  • O assembly está localizado em um diretório que o atributo privatePath da marca investigação especifica no arquivo de configuração do aplicativo.
Quando você executa este aplicativo, você receberá a seguinte mensagem de erro System.IO.FileLoadException :
Definição de manifesto do assembly localizado com o nome de imported type instance não corresponde à referência de assembly.
Causa
Esse problema ocorre quando o tempo de execução assertivas para referências a um assembly. O recurso de probing pára quando a sonda localiza um assembly que tem as seguintes características:
  • O assembly tem o nome especificado.
  • O assembly está localizado em um diretório que o atributo privatePath da marca investigação especifica no arquivo de configuração do aplicativo.
O tempo de execução assertivas para referências para o assembly em diretórios que especifica o atributo privatePath . O runtime procura esses diretórios na ordem em que aparecem no valor do atributo privatePath . Durante essa investigação, o tempo de execução não verifica a versão, o token de chave público ou a cultura do assembly. O tempo de execução assertivas somente para o nome do assembly.
Resolução
Para resolver esse problema, modifique o arquivo de configuração aplicativo para usar a marca codeBase em vez da marca de investigação . A seguir está um exemplo das informações de configuração modificada:
<configuration>   <runtime>      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">         <dependentAssembly>            <assemblyIdentity name="server" publicKeyToken="ae13fa4a5de1ffac" />             <codeBase version="1.0.0.0" href="v1/server.dll"/>            <codeBase version="2.0.0.0" href="v2/server.dll"/>         </dependentAssembly>      </assemblyBinding>   </runtime></configuration>
Observação você pode localizar o valor do atributo publicKeyToken do Server.dll, executando o seguinte comando em um prompt de comando:
sn - TP server.dll
A saída deste comando contém um valor chamado 'Token de chave pública' . Use esse valor para o valor do atributo publicKeyToken da marca assemblyIdentity no arquivo de configuração do aplicativo.
Situação
Esse comportamento é por design.
Mais Informações

Passos para reproduzir o problema

Observação As etapas seguintes assumem que seu computador tem um diretório de aplicativo.
  1. Crie um arquivo par de chaves denominado keypair.snk no diretório de aplicativo usando a ferramenta Strong Name (sn.exe). Para fazer isso, execute o seguinte comando em um prompt de comando:
    sn -k keypair.snk
  2. Em um editor de texto (como o bloco de notas), cole o seguinte código e salve o arquivo como Serverv1.0.cs no diretório do aplicativo:
    using System.Reflection;[assembly: AssemblyVersion("1.0.0.0")][assembly: AssemblyKeyFile("keypair.snk")]public class Server{	public string callServer()	{		return "This is version 1.0.0.0 of the server library.";	}}
  3. Execute os seguintes comandos para criar uma biblioteca usando o arquivo que você criou na etapa 2. O primeiro comando cria uma subpasta chamada V1 no diretório de aplicativo. O segundo comando salva a biblioteca nesse subdiretório.
    mkdir v1
    CSC /target:library /out:v1\server.dll serverv1.0.cs
  4. Em um editor de texto, cole o seguinte código e salve o arquivo como Serverv2.0.cs no diretório do aplicativo:
    using System.Reflection;[assembly: AssemblyVersion("2.0.0.0")][assembly: AssemblyKeyFile("keypair.snk")]public class Server{	public string callServer()	{		return "This is version 2.0.0.0 of the server library.";	}}
  5. Execute os seguintes comandos para criar uma biblioteca usando o arquivo que você criou na etapa 4. O primeiro comando cria uma subpasta chamada V2 no diretório de aplicativo. O segundo comando salva a biblioteca nesse subdiretório.
    mkdir v2
    CSC /target:library /out:v2\server.dll serverv2.0.cs
  6. Em um editor de texto, cole o seguinte código e, em seguida, salve o arquivo como Client.cs :
    using System;public class Client{	static void Main()	{		Server server = new Server();		Console.WriteLine(server.callServer());	}}
  7. Execute o seguinte comando para criar um arquivo executável (.exe), usando o arquivo que você criou na etapa 6. Esse comando faz referência a biblioteca Server.dll no subdiretório V2.
    CSC /reference:server.dll /lib:v2 /nowarn:1607 client.cs
  8. Em um editor de texto, cole as seguintes informações de configuração e, em seguida, salve o arquivo como Client.exe.config :
    <configuration>   <runtime>      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">         <probing privatePath="v1;v2"/>      </assemblyBinding>   </runtime></configuration>
  9. Em um prompt de comando, execute o aplicativo Client.exe.

    Você receber a mensagem de erro mencionada na seção "Sintomas".
  10. Na caixa de diálogo Depuração Just-in-time , clique em não e, em seguida, observe as informações adicionais que aparecem.

    Essas informações são o conteúdo do log Fusion. A última linha dessas informações aparece semelhante à seguinte:
    WRN: Comparing the assembly name resulted in the mismatch: Major Version.
    A sondagem para o assembly pára na biblioteca Server.dll versão 1.0.0.0 que está localizada no diretório V1. No entanto, o arquivo executável foi vinculado estaticamente a biblioteca Server.dll que está localizada no diretório V2. Esta biblioteca é versão 2.0.0.0.
O carregamento de arquivo falhará porque a versão esperada do assembly não corresponde a versão que localiza a investigação.
Referências
Para obter mais informações sobre como o runtime localiza assemblies, visite o seguinte site:
Para obter mais informações sobre a marca de investigação e a marca codeBase no esquema de configurações de tempo de execução para arquivos de configuração, visite o seguinte site:

Propriedades

ID do Artigo: 821626 - Última Revisão: 12/08/2015 02:52:33 - Revisão: 2.4

Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbnosurvey kbarchive kbmt kberrmsg kbschema kbconfig kbappsetup kbprb KB821626 KbMtpt
Comentários