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>
Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top