Ссылка на 2 разных версии log4net в одном решении


Я использую NHibernate 2.1.2.400, который ссылается на log4net 1.2.10.0. В том же проекте я также использую Simply accounting SDK, к сожалению, он все еще использует log4net 1.2.9.0.

поэтому я могу заставить NHibernate работать, если я ссылаюсь на log4net 1.2.10.0, но simplySDK не работает. И наоборот...

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

Я рассматриваю возможность перекомпиляции NHibernate для использования log4net 1.2.9.0, но это кажется неправильным, и я чувствую, что просто учет не будет обновлять свой SDK для использования log4net 1.2.10.0 в ближайшее время.

каков наилучший способ справиться с этим? Можно ли вообще решить эту проблему?

3 70

3 ответа:

Я нашел решение с помощью этого ответ на аналогичный вопрос

вы создаете 2 папки в вашем проекте по одной для каждой версии log4net. Каждый такой как log4net.dll в соответствующей папке, добавив файл в решение (не с добавлением ссылки). Свойство копировать в выходной каталог можно задать для параметра копировать всегда, чтобы оно автоматически копировалось в выходную папку при построении.

затем вы модифицируете приложение.конфигурационный файл путем добавления что-то вроде этого:

<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]

вы можете добавить исключение в реестр. Просто добавьте эти ключи:

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 пропустить проверку для перечисленных сборок. Теоретически это проблема безопасности, но поскольку закрытый ключ все равно открыт, вряд ли это повлияет.

Если перенаправление привязки не работает, а просто бухгалтерский SDK является закрытым исходным кодом, возможным решением является перекомпиляция NHibernate для использования log4net 1.2.9.0.