как мне работать с log4net, постоянно меняя publickeytoken - PullRequest
97 голосов
/ 05 января 2012

У нас есть проект asp.net 4.0, который использует несколько фреймворков, которые зависят от версии 1.2.10.0 log4net. Сегодня я попытался включить новую платформу, которая зависит от log4net версии 1.2.11.0, с тех пор я застрял:

log4net 1.2.10.0 имеет publickeytoken = 1b44e1d426115821

log4net 1.2.11.0 имеет publickeytoken = 669e0ddf0bb1aa2a

Так как они разные, я не могу использовать перенаправления сборок (чтобы все платформы использовали одну и ту же версию log4net) или кодовую базу (чтобы только новая платформа использовала версию 1.2.11.0) через элемент runtime в web.config.

Какие у меня есть варианты?

(и почему звуковой сигнал log4net продолжает изменять publickeytokens между версиями, как я понимаю, потерянный ключ был причиной переключения между версиями 1.2.9.0 и 1.2.10.0, они потеряли ключ еще раз? добровольно предложите мой почтовый ящик, чтобы он был в безопасности, если им это нужно ...)

Edit: Хорошо, ребята из log4net, очевидно, имели идею, что выпуск с двумя ключами - хорошая идея, но это означает, что каждый фреймворк, который вы используете, должен согласовать , который из двух вариантов, которые они предпочитают, или эти фреймворки не могут работать бок о бок в одном и том же домене приложения. Я единственный, кто находит это ужасной идеей? если бы все так делали, все бы сломалось, верно?

Edit2: как я уже говорил, я не использую log4net в своем бизнес-коде, но я использую несколько платформ, которые зависят от 1.2.10.0, и проблема возникла, когда я попытался использовать новую платформу, которая зависела от 1.2.11.0 (новый ключ), поэтому ответ Стефана не применяется, потому что новый фреймворк будет ожидать новый ключ, а не старый

Ответы [ 6 ]

65 голосов
/ 10 января 2012

Вот так у меня все работает с версией 1.2.11.0.

  1. Проклятие apache за изменение ключа в первую очередь:)
  2. Скачать версию 1.2.11.0, подписанную старым ключом.
  3. Разберите собственный код, удалив все прямые ссылки на log4net (новый ключ), и замените ссылкой на сборку, подписанную старым ключом.
  4. Отсортируйте все зависимые сборки, которые вы можете иметь, включив этот сегмент в ваш web / app.config
   <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.2.10.0"
                                 newVersion="1.2.11.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
25 голосов
/ 13 ноября 2014

Я использую последнюю версию log4net, которую я скачал через nuget.Однако одна из библиотек, которую я использую, требует старой версии.Мои проблемы привели меня к этому вопросу.

Проблема с другими ответами заключается в том, что они используют одну и ту же версию dll для всех привязок.Я хочу использовать функции в новой версии для всего остального, кроме устаревшей зависимости.

Чтобы сделать это, вам необходимо сделать следующее:

  1. Начать с загрузка старой версии (версия 1.2.11.0).
  2. Переименуйте загруженный бинарный файл в log4net.1.2.10.dll.Включите его в свой проект запуска с Действие создания , установленное на None и "Копировать, если новее" enter image description here
  3. Скажите .NET, где можно найти старую версию:

App.config

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
            <codeBase version="1.2.10.0" href="log4net.1.2.10.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Атрибут href указывает, где находится старая версия.Следовательно, все остальные запросы на log4net будут указывать на новую версию.

3 голосов
/ 06 января 2012

Вы можете скачать версию log4net 1.2.11.0, подписанную старым ключом. Причина, по которой этот ключ был заменен на новый, объясняется в их часто задаваемых вопросах:

http://logging.apache.org/log4net/release/faq.html#two-snks

(По сути, новый ключ общедоступен, и по какой-то причине они не хотели включать старый ключ в дистрибутив. Однако мне не ясно, почему они не просто сделали старый ключ общедоступным)

1 голос
/ 15 мая 2012

Не знаю, подходит ли он для вашего конкретного случая или нет, но вы можете перекомпилировать одну из платформ, чтобы они использовали log4net с тем же открытым ключом.В моем случае это был FluentNHibernate, который использует log4net 1.2.10 и Combres с log4net 1.2.11 с новым ключом.Я скачал log4net 1.2.11, подписанный старым ключом, и перекомпилировал Combress с ним.После этого добавлено перенаправление привязки сборки с 1.2.10 на 1.2.11, и оно начинает работать.

0 голосов
/ 29 мая 2015

Я пытался перейти по ссылкам, указанным выше, но кажется, что все ссылки на сайте Apache не работают. Тогда вот что я сделал, чтобы решить проблему:

В Visual Studio используйте Nuget для загрузки и установки последней версии log4net (1.2.13.0). Менеджер пакетов NuGet автоматически загрузит и обновит все log4net (1.2.11.0) до последней версии.

0 голосов
/ 21 января 2012

Это не обязательно будет работать во всех случаях, но поскольку проект, который использовал log4net, был OSS, я загрузил исходный код, заменил конфликтующую версию log4net на версию, которую я использовал, и перестроил проект.В моем случае это был Topshelf, поэтому у меня теперь есть версия сборки Topshelf, которая была построена с той же версией log4net, которую я использую, и теперь я могу ссылаться на обе без проблем.

...