як мені працювати навколо log4net, зберігаючи зміну publickeytoken


99

У нас є проект 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) або кодову базу (щоб тільки нова рамка використовувала версію 1.2.11.0) через елемент виконання в web.config.

Які тут мої варіанти?

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

Редагувати: Гаразд, так що хлопці log4net, мабуть, мали ідею, що випуск двох клавіш - це гарна ідея, але це означає, що кожна рамка, яку ви використовуєте, повинна узгоджувати, який із двох ароматів вони надають перевагу, або ці рамки не можуть працювати поруч у тому ж додатку. Чи я єдиний знайшов цю жахливу ідею? якби всі це робили, то все би зламалося, правда?

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


1
IMHO, перша помилка апачі тут полягає в наданні бінарних файлів, підписаних новим ключем: новий ключ призначений для виправленої / розширеної версії з відкритим кодом і не повинен використовуватися як є. Друга помилка полягає в тому, що рамка, про яку ви говорите, була випущена лише з новим підписом log4net: версія зі старим підписом повинна існувати.
JoeBilly

6
Насправді ви дивитесь на третій аромат: той, який генії в SAP перекомпілювали з власним сильним ім'ям, як частина пакету Crystal Reports for Visual Studio, і що ще гірше, вони застрягли в GAC, який зробить ваші залежності від машин кошмар.
Джеремі Головач

Відповіді:


65

Так я працював з версією 1.2.11.0.

  1. Прокляття апачі за зміну ключа в першу чергу :)
  2. Завантажте версію 1.2.11.0, підписану зі старим ключем.
  3. Сортуйте власний код, видаливши прямі посилання на log4net (новий ключ) та замініть посиланням на збірку, підписану старим ключем.
  4. Сортуйте всі залежні збірки, які можуть бути у вас, включивши цей сегмент у вашу веб / 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>

9
Завантажувати версію, підписану старим відкритим ключем, необхідно, оскільки, на жаль, неможливо виконати переадресацію прив'язки до збірки з іншим відкритим ключем.
Девід Крістіансен

2
Це, здається, не вдається через кращу зміну 1.2.11.0: netpl.blogspot.com/2012/03/…
sydneyos

Хтось знайшов рішення проблем, описаних за посиланням, згаданим @sydneyos, яке спричиняє таке виняток:Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Нео

На жаль, немає іншого рішення, крім зниження рівня до 1.2.10. (або перекомпілювати кожну залежну збірку, яку ви використовуєте).
bk0

1
Помістіть збірку 1.2.10 в інший каталог і скористайтеся цим конфігурацією: '<dependentAssembly> <AssemblyIdentity name = "log4net" publicKeyToken = "1b44e1d426115821" culture = "neutral" /> <indingRedirect oldVersion = "0.0.0.0-1.2.9.0 "newVersion =" 1.2.10.0 "/> <codeBase version =" 1.2.10.0 "href =" Ресурси \ log4net-oldkey \ log4net.dll "/> </dependentAssembly> '
Agile Jedi

27

Я використовую останню версію log4net, яку я завантажив через nuget. Однак одна з бібліотек, яку я використовую, вимагає старої версії. Мої неприємності привели мене до цього питання.

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

Щоб зробити це, вам потрібно зробити наступне:

  1. Почніть із завантаження старої версії (версія 1.2.11.0).
  2. Перейменуйте завантажений двійковий файл у log4net.1.2.10.dll. Включіть його у свій запуск проекту, встановивши дію BuildNone і "Копіюйте, якщо новіше" введіть тут опис зображення
  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 будуть вказувати на нову версію.


4
Це чудове рішення, оскільки воно дозволяє підтримувати обидві версії для бібліотек, на які посилаються будь-які.
SouthShoreAK

2
СПАСИБІ! Це врятувало мене. Мені довелося змінити "Копіювати у вихідний каталог" на "Не копіювати", але в іншому випадку це працювало як шарм!
Даніель Геденстром

3

Ви можете завантажити версію log4net 1.2.11.0, яка підписана старим ключем. Причина, чому змінено новий ключ, пояснюється у їхніх поширених питаннях:

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

(В основному новий ключ є загальнодоступним, і чомусь вони не хотіли включати старий ключ у дистрибутив. Мені не ясно, чому вони не просто зробили старий ключ загальнодоступним, хоча)


10
Але коли я використовую сторонню бібліотеку, яка прив’язана до нового ключа, я все ще застрягла (правда?). Це не мій вибір використовувати новий log4net, це третя сторона. Я не бачу, як цей матеріал не підірветься у всіх обличчях, оскільки все більше фреймворків починає використовувати log4net з новим ключем
AndreasKnudsen

Це, на жаль, правильно. Я думаю, вам потрібно врахувати, що всі компоненти не використовують одну і ту ж версію log4net ...
Стефан Еглі

1
.... і як би я пішов робити це? Чи є якийсь механізм в .net для вирішення цього питання?
АндреасКнудсен


1

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


0

Це не обов'язково спрацює у всіх випадках, але оскільки проект, який використовував log4net, був OSS, я завантажив джерело, замінив конфліктуючу версію log4net на версію, яку я використовував, і відновив проект. У моєму випадку це був Topshelf, тож тепер у мене є версія збірки Topshelf, яка була побудована з тією ж версією log4net, яку я використовую, і тепер я можу посилатися на обоє без проблем.


0

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

Використовуйте Nuget зі своєї Visual Studio, щоб завантажити та встановити останню версію log4net (1.2.13.0). Менеджер пакунків NuGet автоматично завантажить і оновить всі log4net (1.2.11.0) до останньої версії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.