Ссылка на 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.