2012-02-16 5 views
2

Я очень новичок в этом, поэтому я приношу свои извинения, если мой вопрос плохо структурирован или находится не в том месте и т. Д. Я хорошо разбирался в решениях и пытался использовать несколько разных подходов, t нашел что-то, что работает так ....Как остановить Nhibernate log4net, конфликтующий с существующим log4net?

У меня есть решение, которое использует 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.

Я нашел еще один вопрос (Referencing 2 different versions of log4net in the same solution), который, я думаю, в основном та же проблема, и они изменяют 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.

+0

Извините, только что понял, что я не включил эту часть. Когда я использую привязку выше, я получаю эту ошибку, как только я пытаюсь запустить решение. '{" Невозможно загрузить файл или сборку 'log4net, Version = 1.2.10.0, Culture = neutral, PublicKeyToken = 1b44e1d426115821' или одну из его зависимостей. Определение манифеста расположенной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040) ":" log4net, Version = 1.2.10.0, Culture = neutral, PublicKeyToken = 1b44e1d426115821 "}' Если я не использую привязку, она работает до тех пор, пока она не попытается ссылаться на другое решение, тогда я получаю ошибку наверху. –

+2

Какую версию NHibernate вы используете? NHibernate больше не требует конкретной версии log4net с версии 3.0.0. – cremor

+0

Не беспокойтесь, это не редкость, когда вы сталкиваетесь с проблемами управления версиями «DLL hell» при запуске проектов OSS; но стоит ли это придерживаться –

ответ

1

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

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

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

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

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

\ EXTERNALREFERENCES \ Log4Net \ \ NHibernate \

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

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

Update 2

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

+0

Я не очень понимаю ваш первый абзац. У меня есть только 2,0-дюймовая версия, упомянутая в моем решении (так что nHibernate работает), но 1.2 "версия" упоминается во всех других решениях, и я не могу изменить все из них, поскольку у меня нет доступа всем им. Я также посмотрю на NuGet, но вы могли бы объяснить первый абзац? –

+0

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