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