Temos um projeto asp.net 4.0 que usa algumas estruturas que dependem do log4net versão 1.2.10.0. Hoje eu tentei incluir um novo framework que depende do log4net versão 1.2.11.0, estive preso desde então:
log4net 1.2.10.0 has publickeytoken = 1b44e1d426115821
log4net 1.2.11.0 has publickeytoken = 669e0ddf0bb1aa2a
Como são diferentes, não posso usar redirecionamentos de montagem (para fazer com que todos os frameworks usem a mesma versão do log4net) ou codebase (para que apenas o novo framework use a versão 1.2.11.0) por meio do elemento runtime em web.config.
Quais são minhas opções aqui?
(e por que o bip é que o log4net fica mudando publickeytokens entre as versões, pelo que entendi uma chave perdida foi a razão para a troca entre a versão 1.2.9.0 e 1.2.10.0, eles perderam a chave mais uma vez? para mantê-lo seguro, se necessário ...)
Edit: Ok, então os caras do log4net aparentemente tiveram a ideia de que lançar com duas chaves era uma boa ideia, mas isso significa que cada framework que você faz uso precisa concordar em qual dos dois sabores eles preferem, ou esses frameworks não funcionam lado a lado lado a lado no mesmo appdomain. Sou o único a achar esta ideia horrível? se todo mundo fizesse isso, tudo iria quebrar, certo?
Edit2: Como afirmei, não estou usando log4net em meu código de negócios, mas uso vários frameworks que dependem de 1.2.10.0, e o problema surgiu quando tentei usar um novo framework que dependia de 1.2.11.0 (nova chave ), então a resposta de Stefans não se aplica, porque a nova estrutura espera a nova chave, não a antiga
fonte
Respostas:
Foi assim que fiz as coisas funcionarem com a versão 1.2.11.0.
fonte
Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Estou usando a versão mais recente do log4net, que baixei por meio do nuget. No entanto, uma das bibliotecas que estou usando requer a versão antiga. Meus problemas me levaram a esta pergunta.
O problema com as outras respostas é que eles estão usando a mesma versão dll para todas as ligações. Quero usar os recursos da nova versão para todo o resto, menos para a dependência legada.
Para fazer isso, você precisa fazer o seguinte:
log4net.1.2.10.dll
. Inclua-o em seu projeto de inicialização com a ação Build definida comoNone
e "Copiar se for mais recente"App.config
Os
href
atributos identificam onde está a versão antiga. Portanto, todas as outras solicitações para log4net apontarão para a nova versão.fonte
Você pode baixar uma versão do log4net 1.2.11.0 que é assinada com a chave antiga. O motivo da mudança para uma nova chave é explicado em seu FAQ:
http://logging.apache.org/log4net/release/faq.html#two-snks
(Basicamente, a nova chave está disponível publicamente e, por algum motivo, eles não queriam incluir a chave antiga na distribuição. Não está claro para mim por que eles não apenas disponibilizaram a chave antiga publicamente)
fonte
Não sei se é adequado para o seu caso particular ou não, mas você pode recompilar um dos frameworks, então eles usarão log4net com a mesma chave pública. No meu caso foi FluentNHibernate que usa log4net 1.2.10 e Combres com log4net 1.2.11 com nova chave. Eu baixei o log4net 1.2.11 assinado com a chave antiga e recompilei o Combress com ela. Depois disso, a associação de assembly adicionada redireciona de 1.2.10 para 1.2.11 e começa a funcionar.
fonte
Isso não funcionará necessariamente em todos os casos, mas como o projeto que estava usando log4net era OSS, baixei o código-fonte, substituí a versão conflitante do log4net pela versão que estava usando e reconstruí o projeto. No meu caso, era o Topshelf, então agora tenho uma versão do conjunto Topshelf que foi construída com a mesma versão do log4net que estou usando e agora posso fazer referência a ambos sem problemas.
fonte
Tentei acessar os links fornecidos acima, mas parece que todos os links no site do Apache não estão funcionando. Então, fiz o seguinte para resolver o problema:
No Visual Studio, use o Nuget para baixar e instalar a versão mais recente do log4net (1.2.13.0). O gerenciador de pacotes NuGet baixará e atualizará automaticamente todo o log4net (1.2.11.0) para a versão mais recente.
fonte