Por que meu aplicativo sempre usa a versão mais recente do GAC em vez da versão referenciada?
-
13-12-2019 - |
Pergunta
Contexto
Tenho 2 versões diferentes de um assembly instalado no GAC, versão 1.0 e versão 2.0.Fiz um aplicativo que faz referência a 1.0 como uma versão específica.
Emitir
Quando executo meu aplicativo, ele sempre carrega a versão 2.0, enquanto o aplicativo faz referência específica à versão 1.0.
Pergunta
Por que isso está acontecendo?Como posso forçar meu aplicativo a carregar a versão para a qual foi compilado?
Não me parece que isso tenha algo a ver com um redirecionamento de ligação, pois meu aplicativo nem tinha conhecimento da versão 2.0 quando o construí e que os metadados de referência "Versão específica" estão definidos como verdadeiros.
Obrigado.
Editar:
O assembly ao qual estou me referindo é, na verdade, Oracle.DataAccess do pacote ODAC.Percebi que outros assemblies chamados Policy.x.xxx.Oracle.DataAccess foram publicados no GAC.
Editar 2:
Depois de examinar a política Oracle.DataAccess, encontrei a configuração que define o redirecionamento de ligação:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Embora eu tenha adicionado o redirecionamento de ligação reversa à configuração do meu aplicativo, a política no GAC parece ter prioridade.Eu encontrei um Artigo MSDN tratando do assunto e sugerindo ignorar a política com esta configuração:
<publisherPolicy apply="no" />
Mas ainda não funciona...
Editar 3:
Tentei remover a política do GAC e reiniciei minha máquina.Finalmente funcionou.Não parece um desenvolvimento de solução confortável, mas esta política quebrou um dos meus aplicativos, o que significa que desabilitar a política é a coisa certa a fazer no meu caso.
Edição final:
Igor me deu a resposta certa.Tudo o que tive que fazer para contornar essas políticas foi usar o publisherPolicy
configuração na seção de configuração correta:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<publisherPolicy apply="no"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Solução
Depois de editar sua pergunta, fica claro que este é o arquivo de política que afeta a ligação do assembly.
No caso do Oracle existe um arquivo chamado Policy.X.Y.Oracle.DataAccess.config com conteúdo semelhante a este:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
A política é instalada pelo Oracle Installer e redireciona Oracle.DataAccess.dll
para a versão mais recente, pois a Oracle acredita que a biblioteca é compatível com versões anteriores.
EDITAR:Se você não quiser que a política do editor seja aplicada para uma determinada montagem, coloque o elemento no elemento:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly" publicKeyToken="..." culture="en-us" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>