Подтвердить что ты не робот

Как исправить "Невозможно разрешить конфликт между" ошибкой?

Недавно добавлен log4net.dll в наш объект данных. Наш объект данных строит отлично, но когда вы пытаетесь построить что-либо, что ссылается на наш объект данных, вы получите следующую ошибку:

Невозможно разрешить конфликт между "log4net, Version = 1.2.10.0, Culture = neutral, PublicKeyToken = 692fbea5521e1304" и "log4net, Version = 1.2.9.0, Culture = neutral, PublicKeyToken = b32731d11ce58905". Выбор "log4net, Version = 1.2.10.0, Culture = neutral, PublicKeyToken = 692fbea5521e1304" произвольно.

Я нашел следующий поток, который позволил мне получить больше информации о проблеме.

log4net используется для разных целей в нашем проекте. Например, кристалл установил 1.2.9 в GAC. Я знаю, что infragictics использует 1.2.10.

У нас есть конкретный каталог - назовите его c:\references - где мы построим все наши dll и чтобы все наши приложения использовали для ссылки на наши внутренние dll. Поэтому я специально установил ссылку на наш объект данных на c:\references\log4net.dll, который является версией 1.2.11. Что странно, потому что в сообщении об ошибке выше вы не видите 1.2.11. В dll указывается конкретная версия: = True и Copy Local: = True. Я проверил каталог сборки, и 1.2.11 log4net правильно переместился.

Если это помогает, вот некоторые из подробных сообщений об ошибках:

There was a conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905".
  No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily.
      References which depend on "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" [C:\Windows\assembly\GAC_32\log4net\1.2.10.0__692fbea5521e1304\log4net.dll].
          C:\Windows\assembly\GAC_MSIL\CrystalDecisions.Shared\13.0.2000.0__692fbea5521e1304\CrystalDecisions.Shared.dll

   References which depend on "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905" [C:\Program Files (x86)\Business Objects\Common\4.0\managed\log4net.dll].          c:\references\DBObjectAdoNet.dll
            Project file item includes which caused reference "c:\references\DBObjectAdoNet.dll".

Обновить. Пока единственный способ исправить ошибку - ссылаться на log4net во всех ссылках на DBObjectAdoNet.dll. Это не очень удобное для нас решение, поскольку все в нашей системе использует его.

2-е обновление. Пробовал помещать log4net в мышление GAC, чтобы устранить проблему, но все равно не идти.

3-е обновление. Я позвонил в Microsoft. Они хотят, чтобы я использовал Assembly.LoadFrom(), который я очень, очень не решаюсь, так как мы делаем более 300 000 вызовов в одном приложении и потребуем отражения для каждого вызова, который немного замедлит работу.

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

4b9b3361

Ответ 1

Мы выяснили, что кристальное время выполнения было определенно проблемой. Если мы удалим log4net в %windir%\assembly, что установленное время выполнения кристалла, предупреждение будет удалено. Что странно, если я установлю log4net 1.2.10 с сайта log4net в GAC, тогда предупреждающее сообщение не появится снова. Если кто-нибудь может объяснить это, пожалуйста, добавьте в эту тему. Кристалл подписывает log4net со своим собственным сильным ключом (токен открытого ключа отличается).

Ключом к исправлению проблемы log4net является то, что log4net является проектом с открытым исходным кодом. Это означает, что мы можем просто построить dll из источника с другим именем. Еще не пробовал, но это должно решить проблему. У нас будет дополнительный шаг построения от источника каждый раз, когда мы хотим обновить log4net, но учитывая, насколько мы собираемся обновить dll, это не имеет большого значения.

Ответ 2

Откройте файл проекта (.csproj на С# или .vbproj в VB.NET) для редактирования.

Убедитесь, что ссылка log4net Полностью квалифицированное имя типа, имеет HintPath и SpecificVersion=True.

<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
  <HintPath>..\references\log4net.dll</HintPath>
  <SpecificVersion>True</SpecificVersion>
</Reference> 

Сохраните файл и попытайтесь восстановить.