2011-01-10 5 views
12

Мне было предложено взглянуть на ошибку в приложении ASP/C# с ее интеграцией с Paypal. Ошибка, показанная в полном объеме, является:Не удалось загрузить файл или сборку log4net или одну из его зависимостей

Не удалось загрузить файл или сборку 'log4net, Version = 1.2.0.30714, Culture = нейтрально, PublicKeyToken = b32731d11ce58905' или один из его зависимостей. Установленное определение манифеста показывает, что не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Из того, что я понимаю, это означает, что фактический файл, расположенный (то есть, log4net.dll в моем каталоге BIN) не соответствует версии ожидаемой на основе некоторой конфигурации сборки. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти, где этот файл ссылается.

У меня есть доступ ко всем файлам в корневом каталоге веб-сайта сайта и не удается найти файлы конфигурации, ссылающиеся на эту DLL. Где еще мне нужно искать, чтобы определить, что вызывает неправильное совпадение?

В качестве примечания, я убедился, что версия DLL в каталоге bin обновлена, но это, похоже, ничего не разрешило.

ответ

9

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

+0

Это имеет смысл. Есть ли способ для меня увидеть, какая ссылка делается в проекте - какой файл будет обычно располагаться при просмотре скомпилированного проекта? – Elie

+0

Вы не должны смотреть на скомпилированный проект, но не скомпилированный - файл csproj. в противном случае, я думаю, что depend.exe (в сообщении Марка) поможет. – Femaref

+0

Это также можно проверить в пакетах nuget. Если один из ваших проектов ссылается на log4net версии 1.2.3.4, а другие проекты ищут log4net версии 5.6.7.8, тогда вы получите эту ошибку. (или любые другие пакеты nuget). Просто совместите эти версии, и вам хорошо идти. – Krishna

1

У меня нет никакой полезной информации о конкретной ошибке. Однако в случае, если вы не использовали их, несколько полезных утилит для решения этой проблемы - Dependency Walker и .NET Reflector.

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

2

Возможно, у вас есть последняя версия log4net, но есть проект, который ссылается на старый. Вы можете заставить все сборки, ссылающиеся на старую версию, чтобы ссылаться на новую версию, используя <bindingRedirect>

Вы можете найти более подробную информацию о них здесь: http://msdn.microsoft.com/en-us/library/eftw1fys.aspx

Если вы не знаете конкретную версию для перенаправления, вы можете также используйте ряд версий и укажите их все в вашей конкретной версии.

1

Я также столкнулся с этой проблемой, и причина этого в том, что проект по какой-то причине вытаскивал log4net из GAC, поэтому вполне возможно, что версия в GAC не соответствует версии, на которую ссылаются в вашем проекте

14

У нас была эта проблема, когда мы перешли на VS 2010 и .NET 4.0, мы вообще не используем log4net, но я подозреваю, что что-то еще мы используем (возможно, Crystal Reports?), и я также подозреваю есть dll, который мы используем, это также 32-разрядная dll, потому что, когда я изменяю параметр «Включить 32-разрядные приложения» в расширенных настройках пула приложений в IIS, «True», все работает снова.

+0

Yup, для меня это определенно связано с Crystal Reports. – basher

+0

Это смешно. Это случилось и со мной - просить ссылку, которую мое решение не использует вообще. Мое решение, которое «работало», просто перезапустило VS2017. И я точно знаю, что ранее загруженный проект использует log4net. Но тока совсем нет. Кажется, они делятся некоторыми файлами temp или smth, и есть столкновение. – Saulius

4

У нас была аналогичная проблема с нашим веб-приложением. Мы перешли от древнего .NET 1.1 32-бит к .NET 4.0 64-бит.

ошибка я получал в рамках нашего одного из наших пользовательских элементов управления было следующее:

ASP.NET runtime error: Could not load file or assembly 'log4net' or one of its dependencies. An attempt was made to load a program with an incorrect format. 

Мое предположение в том, что мы компиляции DLL в 64-битной, но его ссылки библиотеки DLL в 32-битную ? Я бы согласился с тем, что сказал выше Мэтт Палмерли - переключение пула приложений на 32-разрядный режим. УДАЛЯЕТ проблему, но вы все еще застряли в 32-битном пуле приложений. Мы хотели воспользоваться дополнительной памятью. 64-битная версия предложит пулы приложений IIS.

В конечном счете, я не смог выяснить, какая из сторонних DLL-файлов действительно ссылалась на log4net. Я заметил, что после сборки, хотя log4net.dll был скопирован в мой каталог «bin», и я сразу щелкнул по нему и понял, что это связано с Apache Foundation. http://logging.apache.org/log4net/

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

log4net download

Надеется, что это помогает

+0

У меня была такая же проблема .. это была ссылка на log4net от GAC, поэтому ваши комментарии помогли мне исправить это ... спасибо – Munawar

0

Я собирался последовать совет Мэтты, чтобы включить 32-битные приложения в настройках пула приложений IIS.

Оказывается, мне даже не нужно было так далеко, ошибка была решена, как только я переключился на IIS из Кассини.

Чтобы переключиться на IIS:

  1. Включить IIS в Windows, Программы и компоненты (Убедитесь, что также позволит "ASP.NET хх" узел под IIS> World Wide Web Services> Особенности разработки приложений)
  2. В проекте «Свойства»> «Веб»> «Использовать локальный веб-сервер IIS»> «Создать виртуальный каталог» (для этого необходимо запустить VS в качестве администратора).
  3. Построить проект> Выполнить
  4. ошибку

Нет log4net для меня после этого.

Я не знаю, почему я получал его, потому что я даже не использую log4net в любом месте, но я рад, что он ушел.

2

Такая же ошибка здесь, вот как мы исправили: загрузка последней версии .Net 4.0 log4net.dll из Apache и замена версии в папке bin работала для меня. Вы должны добавить ссылку на свой проект, чтобы сделать его постоянным. Вот ссылка: Apache

Перейти к загрузке, бинарникам и выбрать новую ключевую версию. После загрузки перейдите в папку .Net 4.0, чтобы найти DLL-файл.

0

После прочтения этих ответов я закончил проверку .csproj и нашел фактическую ссылку на «Lib \ log4net.dll» в этом разделе. Я удалил это и скомпилировал проект.

Смежные вопросы