Ссылка на 2 разных версии log4net в одном решении
Я использую NHibernate 2.1.2.400, который ссылается на log4net 1.2.10.0.
В том же проекте я также использую простой учетный SDK, к сожалению, он все еще использует log4net 1.2.9.0.
Итак, я могу заставить NHibernate работать, если ссылаюсь на log4net 1.2.10.0, но simpleSDK не работает. И наоборот...
Я предполагаю, что большинство проблем связано с тем, что log4net изменил свой код сборки. Я попытался использовать перенаправление привязки без успеха: у 2 DLL нет одинакового ключа.
Я рассматриваю возможность перекомпиляции NHibernate для использования log4net 1.2.9.0, но мне кажется, что это не так, и я чувствую, что Simply Accounting не будет обновлять свой SDK, чтобы использовать log4net 1.2.10.0 в ближайшее время.
Каков наилучший способ справиться с этим? Можно ли вообще разрешить?
Ответы
Ответ 1
Я нашел решение, используя этот ответ на аналогичный вопрос
Вы создаете 2 папки в своем проекте по одному для каждой версии log4net. Поместите каждый log4net.dll в соответствующую папку, добавив файл в решение (а не ссылку на ссылку). Вы можете установить копию для вывода свойства каталога для копирования всегда, чтобы она автоматически копировалась в выходную папку при ее создании.
Затем вы модифицируете файл app.config, добавив что-то вроде этого:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="681549d62126b7b8" />
<codeBase version="1.2.9.0" href="log4netv1.2.9.0\log4net.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
<codeBase version="1.2.10.0" href="log4netv1.2.10.0\log4net.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
<codeBase version="1.2.11.0" href="log4net.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
вы можете получить токен открытого ключа сборки, используя sn -T [assemblyName]
Ответ 2
Вы можете добавить исключение в реестр. Просто добавьте эти ключи:
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,681549d62126b7b8
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,1b44e1d426115821
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,669e0ddf0bb1aa2a
Это приведет к пропуску проверки пропусков .net для перечисленных сборок. Теоретически это проблема безопасности, но поскольку закрытый ключ в любом случае отсутствует, вряд ли это будет иметь последствия.
Ответ 3
Если перенаправление привязки не работает, и простой учетный SDK является закрытым источником, возможно решение перекомпиляции NHibernate для использования log4net 1.2.9.0.