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

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

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

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

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

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

13.10.2009 12:55:02
Это приложение asp.net?
Aaron Fischer 14.10.2009 00:14:50
14 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

  • NHibernate.ByteCode.Castle.dll
14
29.04.2012 01:36:18

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

-1
13.10.2009 12:57:52
NHibernate.dll находится в папке bin, и у меня есть оба следующих кода в коде «использование NHibernate; использование NHibernate.Cfg;»
GaryDevenay 13.10.2009 13:03:43

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

0
29.04.2012 01:37:15

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

0
13.10.2009 14:54:00

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

1
14.10.2009 09:06:38

Недавно я обновил наш проект до версии 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 и сценария, содержащего вызов aspnet_compiler.exe), NHibernate.ByteCode.Castle.dll нигде не было найдено.

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

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

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

2
15.10.2009 16:44:32

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

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

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

Вот шаги, которые я предпринял, чтобы решить эту проблему:

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

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

5
15.10.2009 16:57:18

В моем случае «Чистое решение», а затем «Перестройка решения» решили проблему.

3
27.10.2009 22:00:02

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

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

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

Другим решением может быть явная установка привязок сборки из файла app.config.

4
10.03.2010 19:46:32
+1 для ссылки app.config. Мне нужно было искать подобную проблему с FakeItEasy.
Aligned 26.02.2013 17:45:13

У меня была эта проблема после обновления 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.

1
9.12.2010 08:53:51

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

<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Включен в сообщении об ошибке.

6
3.04.2019 11:23:53

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

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

1
27.03.2011 00:13:33

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

1
29.04.2012 01:40:42

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

0
25.10.2013 07:22:32