Как мне остановить конфликт Nhibernate log4net с существующим log4net? - PullRequest
2 голосов
/ 16 февраля 2012

Я очень новичок в этом, поэтому я прошу прощения, если мой вопрос плохо структурирован или просто не в том месте, и т. Д. Я хорошо искал решения для этого и попробовал несколько различных подходов, но покане нашел ничего, что работает так ...

У меня есть решение, которое использует Nhibernate, и, следовательно, должен использовать log4net V1.2.10.0, который входит в папку log4net / 2.0 /.Однако мое решение также связано с рядом других решений, к которым у меня очень ограниченный доступ.Они используют тот же log4net V.1.2.10.0, но в папке: log4net / 1.2 /

Когда я запускаю свое решение, я получаю эту ошибку.

{"Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from HRESULT: 
0x80131040)":"log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d"}

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

Я нашел другой вопрос ( Ссылка на 2 разные версии log4net в одном и том же решении ), который, на мой взгляд, в основном та же проблема, и они связывают app.config с привязкой, однакоЯ не могу понять это правильно, так как я все еще получаю ту же ошибку.Привязка, которую я включил в свой app.config, такова:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="e27b8fa57f63a98d" />
    <codeBase version="1.2.10.0" href="2.0\log4net.dll" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821"/>
    <codeBase version="1.2.10.0" href="1.2\log4net.dll" />
  </dependentAssembly>
 </assemblyBinding>
</runtime>

Я не уверен, что означает ответ на другой вопрос, когда он говорит: «Вы создаете 2 папки в своем проекте по одной для каждойверсия log4net. Вы помещаете каждый файл log4net.dll в соответствующую папку, добавляя файл в решение (не с добавлением ссылки). Вы можете установить свойство копирования в выходной каталог, чтобы всегда копировать его, чтобы он автоматически копировался в выходной файл.папка при сборке. "И нужно ли мне делать это с каждым решением, на которое ссылается мое решение?

В идеале я хочу иметь возможность внести поправку в свое решение, которое просто означает, что ему все равно, какой log4net использует какое-либо из решений, но они все равно могут передавать сообщения журнала между собой.Я предполагаю, что это возможно, поэтому любая помощь будет высоко ценится.Или это, или как мне отключить регистратор nHibernate, чтобы ему было все равно, какой log4net я использую, чтобы я мог просто продолжать использовать log4net / 1.2, который используют все другие решения.Я пробовал все виды вещей, чтобы отключить его, но все равно кажется, что он пытается найти log4net / 2.0.

1 Ответ

1 голос
/ 16 февраля 2012

Вам повезло, что у вас есть одна и та же DLL в двух разных местах, что облегчает решение вашей проблемы. Вы можете просто сделать резервную копию и затем удалить одну из ссылок на DLL (\ 1.2 \ version?), А затем разрешить любые неработающие ссылки в вашем решении - это должно привести вас к точке, которую вы можете скомпилировать.

Вы тоже пробовали NuGet? Вы можете добавить ссылку на Log4Net, а затем добавить ссылку на Nhibernate, которая увидит, что вы уже выполнили ее требование зависимости и не нужно загружать другую ссылку на NHibernate.

Я бы порекомендовал кривую обучения использованию NuGet, потому что это мощный инструмент, который должен значительно облегчить вашу жизнь в долгосрочной перспективе.

Обновление Пожалуйста, смотрите мой комментарий о предоставлении вашей текущей структуры папок, чтобы помочь - в случае, если вы можете сделать это; следующее должно начать вас.

Чтобы попытаться сделать это, используя только прямые ссылки на файлы, вам может понадобиться переместить ваши DLL в лучшую структуру. Внутри вашего решения (не проекта) создайте следующую структуру папок под элементами решения.

\ EXTERNALREFERENCES \ Log4Net \ \ NHibernate \

Переместите одну копию DLL log4net в сетевую папку log 4 (и удалите другой экземпляр), а затем переместите все используемые вами библиотеки NHibernate (за исключением Log4Net) в каталог NHibernate. Удалите привязки внутри вашего app.config и затем просматривайте каждый проект, обновляя ссылки, чтобы указать версию внутри внешних ссылок.

Фактическое расположение файлов не так важно, вам просто нужно, чтобы ваш код ссылался на один экземпляр DLL, а затем, когда он собирается, все они копируются в папку bind. Вы просто сталкиваетесь с проблемами, потому что у вас есть два экземпляра - пока вы редактируете свой код и т. Д. NHibernate на самом деле не слишком обеспокоен тем, где находится Log4Net; он просто зависит от него, который должен быть заполнен при запуске.

Обновление 2

Новая версия Log4Net на NuGet, которая нарушает обратную совместимость - см. Ссылку в блоге для получения дополнительной информации. В настоящее время существует версия 1.24.0 для Log4Net, которая содержит строгое имя, отличное от 1.2.10.0, что делает все немного сложнее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...