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

Не удалось загрузить файл или сборку в NHibernate

Недавно у меня возникли проблемы с файлом hibernate.cfg.xml, так как у меня не было следующей строки.

<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

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

Не удалось загрузить файл или сборку "NHibernate, Version = 2.1.0.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4" или одну из его зависимостей. Расположенное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Почему я получаю эту ошибку и как ее исправить?

4b9b3361

Ответ 1

Эти файлы должны находиться в том же каталоге, что и указанный файл, NHibernate.dll:

  • Antlr3.Runtime.dll
  • Iesi.Collections.dll
  • log4net.dll
  • Castle.Core.dll
  • Castle.DynamicProxy2.dll

Также вы должны добавить ссылку или скопировать ее тоже:

  • NHibernate.ByteCode.Castle.dll

Ответ 2

Я предполагаю, что вы недавно обновили NHibernate до 2.1?

Если это так, я думаю, у вас есть разные проекты, ссылающиеся на разные версии NHibernate.

Это случилось со мной и сложнее отследить, чем вы могли подумать.

Это шаги, которые я предпринял для его решения:

  • Удалить все файлы во всех каталогах bin в ваших проектах. Обычно Clean Solution хорошо подходит для этого, но это не так, вам может понадобиться сделать это с помощью командной строки или вручную.
  • Отредактируйте все ваши файлы .csproj. Отредактируйте их либо текстовым редактором, либо выполните проект "Разгрузка", затем отредактируйте файл .csproj.
  • Убедитесь, что ВСЕ ваши узлы HintPath указывают на ту же (новую) версию DLL

Это, надеюсь, прояснит эту проблему для вас.

Ответ 3

У меня тоже была эта проблема.

Для меня проблема заключалась в том, что FluentNHibernate ожидал другую версию NHibernate (2.1.0.4000), чем я предполагал включить в проект (2.1.2.4000). Я наткнулся на это, отдельно загружая последние версии каждой библиотеки.

Чтобы устранить проблему, я изменил ссылку на NHibernate, чтобы указать на более старую версию NHibernate, которая поставляется с RTM FluenNHibernate 1.0 (2.1.0.4000).

Еще одно решение может заключаться в том, чтобы явно установить привязки к сборке из файла app.config.

Ответ 4

Как будущая ссылка: Если вы столкнулись с теми же проблемами Рэнди Клингельберге (проблемы зависимости между NHibernate и FluentNHibernate или любой другой зависимой библиотекой), вы можете указать перенаправление для сборок, которые предназначено для старой версии. Это не позволяет перекомпилировать зависимую сборку.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" />
      <bindingRedirect oldVersion="3.0.0.3001" newVersion="3.0.0.4000" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Этот код перенаправляет запросы для старой версии (3.0.0.3001 в моем случае) на тот, который фактически используется (3.0.0.4000). PublicKeyToken включен в сообщение об ошибке.

Ответ 5

Недавно я обновил наш проект с 1.0 RTM-версией FluentNHibernate, в которой требовались последние бит NHibernate. Это привело к той же проблеме, с которой вы сталкиваетесь.

Наша структура проекта была примерно такой:

Repository root
    Solution
        Web
            References
                DataAccess
        ... other projects/layers ...
        DataAccess
            References
                ..\ReferenceAssemblies\NHibernate.dll
                ..\ReferenceAssemblies\FluentNHibernate.dll
    ReferenceAssemblies

(Все внешние DLL находятся в каталоге ReferenceAssemblies.)

Моя первая попытка решить эту проблему была путем добавления ссылки на NHibernate.ByteCode.Castle.dll в проект DataAccess. Это сработало... но только в разработке...

Когда я опубликовал веб-приложение на нашем клиентском тестовом сервере (что происходит автоматически с помощью TeamCity и script содержащий вызов aspnet_compiler.exe), NHibernate.ByteCode.Castle.dll нигде не было найдено.

Я не уверен, почему это происходит, но я подозреваю, что это имеет какое-то отношение к тому факту, что никакой код в нашем приложении фактически не вызывает код в этой конкретной DLL. Кроме того, там (исправьте меня, если я ошибаюсь) никакая жесткосвязанная ссылка из NHibernate.dll в NHibernate.ByteCode.Castle, поэтому где-то по этой ссылке игнорируется (предположительно неиспользуемая) dll.

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

(Я не очень люблю иметь такую ​​ссылку в этом конкретном проекте, но эй!): -)

Ответ 6

В моем случае "Clean Solution", а затем "Rebuild Solution" решила проблему.

Ответ 7

Вероятно, у вас есть код, ссылающийся на две разные версии DLL NHibernate. NHibernate.dll, который вы загружаете с помощью NHibernate, скорее всего, отличается от той, которую вы загружаете, скажем, Castle ActiveRecord. Постарайтесь придерживаться только версии DLL NHibernate, которая поставляется с NHibernate.ByteCode.Castle. И убедитесь, что у вас нет NHibernate DLL (любой версии) в вашем GAC (по крайней мере, пока вы не решите эту проблему).

Ответ 8

У меня возникла эта проблема после обновления NHibernate до 3.0 и Spring до ночной сборки, в которой использовался NH 3.0. Проблема заключалась в том, что Spring.Data.NHibernate30.dll ссылался на более старую версию NHibernate.dll(v 3.0.0.2002), а у меня был v 3.0.0.4000.

Моим решением было открыть исходный проект Spring.Data.NHibernate30, удалить ссылки на более раннюю версию NHibernate, добавить ссылку на версию 3.0.0.4000, перестроить и теперь в моем проекте добавить ссылку на эту (новую) версию Spring.Data.NHibernate30.dll.

Ответ 9

Я только что это случилось со мной - в моем случае это был мой первый опыт NHibernate (и Fluent NHibernate). Я выполнил большую часть моего приложения в сборке .dll, на которое ссылается отдельная исполняемая сборка. Исполняемый файл, который не имел ссылок на NHibernate напрямую, давал мне ошибку.

Я использую NuGet для вывода Fluent NHibernate, поэтому я добавил ссылку Fluent NHibernate на исполняемые сборки. Не чувствует себя супер чистым, но он получает зависимости в .bin-папке и устраняет ошибку. (смешно, что это не так (кажется?) происходит с другими библиотеками, такими как NLog)

Ответ 10

Я столкнулся с той же проблемой. Я очистил "Временные файлы Интернета", и этот вопрос исчез.

Ответ 11

NHibernate имеет несколько других сборок, кроме nhibernate.dll. У вас есть все (в том же выпуске)?

Ответ 12

Вам следует ссылаться на зависимые сборки (я думаю, это "NHibernate.ByteCode.Castle" ) и установить для атрибута "copy local" значение true.

Ответ 13

В вашем решении могут быть разные проекты. Этот проект может ссылаться на разные версии NHibernate.dll. Проверяет версии во всех проектах и ​​восстанавливает проект

Ответ 14

Похоже, что dll NHibernate не копируется в каталог bin вашего приложения. Убедитесь, что он указан и существует в каталоге bin.