Не удалось загрузить файл или сборку в NHibernate - PullRequest
15 голосов
/ 13 октября 2009

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

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

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

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

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

Ответы [ 14 ]

14 голосов
/ 15 октября 2009

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

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

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

  • NHibernate.ByteCode.Castle.dll
5 голосов
/ 14 марта 2011

Как будущая ссылка: Если у вас возникли те же проблемы, на которые указал Randy 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 включено в сообщение об ошибке.

5 голосов
/ 15 октября 2009

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

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

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

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

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

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

4 голосов
/ 10 марта 2010

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

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

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

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

2 голосов
/ 28 октября 2009

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

2 голосов
/ 15 октября 2009

Я недавно обновил наш проект до версии 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 непосредственно в веб-проект. Теперь я могу без проблем удалить ссылку, добавленную в первой попытке.

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

1 голос
/ 20 августа 2011

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

1 голос
/ 27 марта 2011

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

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

1 голос
/ 09 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...