Como operar com várias versões de montagem em pastas privadas usando o Config?
-
10-07-2019 - |
Pergunta
Eu tenho um cenário em que tenho várias versões da mesma montagem que preciso armazenar nas pastas privadas do aplicativo, em uma estrutura como esta:
.\My.dll // latest version, say 1.1.3.0
.\v1.1.1\My.dll // version 1.1.1.0
.\v1.1.2\My.dll // version 1.1.2.0
Meu problema é que o tempo de execução do .NET, quando solicitado a uma das versões mais antigas, sempre encontra a versão mais recente e depois falha devido à criação de números de incompatibilidade antes de tentar investigar para uma correspondência melhor.
Os assemblies são fortes e estou usando esta configuração no meu app.config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="My"
publicKeyToken="xxxxxxxx" culture="netural" />
<bindingRedirect oldVersion="1.0.0.0-1.1.1.0"
newVersion="1.1.1.0" />
<bindingRedirect oldVersion="1.1.3.0-1.1.65535.65535"
newVersion="1.1.3.0" />
<codeBase version="1.1.1.0" href="v1.1.1\My.dll" />
<codeBase version="1.1.2.0" href="v1.1.2\My.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Espero que haja algo que eu perdi aqui. Eu sei que isso pode ser resolvido em código ouvindo o AppDomain.ASSEMBLYRESOLVE Evento, mas eu adoraria ver uma solução de configuração pura.
Atualizar: Então, eu encontrei o bug, que é como Kent assumiu, um erro de digitação. culture="netural"
deveria estar culture="neutral"
. Dito isto, sem o erro de digitação, resolver funciona muito bem ao usar codeBase
Elementos que apontam para cada versão. O elemento de sondagem não parece funcionar nesse cenário.
Solução
Sem ver a solução inteira, só posso assumir que você tem um erro de digitação em algum lugar. Eu apenas tentei isso para mim e - com a ajuda de FusLogvw, Pude fazer com que funcionasse.
Eu tenho três versões da montagem e o aplicativo consumidor faz referência a uma versão mais antiga do que em seu diretório de saída. O CLR encontra os redirecionamentos e a entrada da base de código e carrega a versão correta (mais antiga).
Posso enviar a você minha solução se você fornecer um endereço de e -mail.
Kent
Outras dicas
Você pode usar um probepath? Usamos isso para forçar não controlados (por exemplo, resolvedores de terceiros - como o MSTEST) a procurar assembléias onde precisamos que eles estejam.
<?xml version ="1.0"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="v1.1.1;v1.1.2;"/>
</assemblyBinding>
</runtime>
</configuration>
Ver aqui para mais informações