Как я работаю вокруг log4net, сохраняя изменения publickeytoken

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

log4net 1.2.10.0 имеет publickeytoken = 1b44e1d426115821

log4net 1.2.11.0 имеет publickeytoken = 669e0ddf0bb1aa2a

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

Каковы мои варианты здесь?

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

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

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

Ответ 1

Вот как я работал с версией 1.2.11.0.

  • Проклятие apache для изменения ключа в первую очередь:)
  • Загрузить версию 1.2.11.0, подписанную со старым ключом.
  • Отсортируйте свой собственный код, удалив любые прямые ссылки на log4net (новый ключ) и замените ссылкой на сборку, подписанную старым ключом.
  • Отсортируйте любые зависимые сборки, которые у вас есть, включив этот сегмент в свой файл 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>

Ответ 2

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

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

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

  • Начните с загрузки старой версии (версия 1.2.11.0).
  • Переименуйте загруженный двоичный код в log4net.1.2.10.dll. Включите его в свой проект запуска с настройкой Build, установленной на None и "Скопировать, если новый", enter image description here
  • Скажите .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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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