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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top