NHibernate не может загрузить сборки (NHibernate.ByteCode.Castle и BusinessLogic) из GAC - PullRequest
0 голосов
/ 30 августа 2010

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

Вот настройка:

Я использую ActiveRecord / NHibernate. Я создал сборку ActiveRecord, которая называется BusinessLogic. Идея состоит в том, что все мои проекты должны использовать BusinessLogic вместо прямой ссылки на ActiveRecord / NHibernate.

Я установил следующие файлы в GAC (глобальный кэш сборок .NET):

  • Antlr3.Runtime.dll BusinessLogic.dll
  • BusinessLogic.dll
  • Castle.ActiveRecord.dll
  • Castle.Components.Validator.dll
  • Castle.Core.dll
  • Castle.DynamicProxy2.dll
  • Iesi.Collections.dll log4net.dll
  • NHibernate.ByteCode.Castle.dll
  • NHibernate.dll

Проблема заключается в следующем: при запуске приложения ASP.NET, которое считывает информацию о продукте из базы данных, я получаю следующее сообщение об ошибке:

Unable to load type 'NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle' during configuration of proxy factory class.
Possible causes are:
- The NHibernate.Bytecode provider assembly was not deployed.
- The typeName used to initialize the 'proxyfactory.factory_class' property of the session-factory section is not well formed.

Если я поместил локальную копию NHibernate.ByteCode.Castle.dll в папку bin приложения ASP.NET, ошибка исчезнет. Но появляется новая ошибка. В нем говорится, что NHibernate не может найти классы в BusinessLogic.dll (например, Product и т. Д.).

Если я поместил локальную копию BusinessLogic.dll в папку bin приложения ASP.NET, даже эта ошибка исправлена, и приложение работает отлично.

Это, однако, нежелательно, поскольку я не хочу перекомпилировать каждое приложение с использованием BusinessLogic при каждом обновлении BusinessLogic.

Я нашел эту статью, которая обещала быть полезной: http://markmail.org/message/o22r2x5fng7i6jn5#query:activerecord%20gac+page:1+mid:4rlqoicqyxjh3ypb+state:results

К сожалению, это не решает проблему.

Я поместил в файл machine.config следующее:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <qualifyAssembly partialName="NHibernate.ByteCode.Castle" fullName="NHibernate.ByteCode.Castle,version=2.1.2.4000,publicKeyToken=aa95f207798dfdb4,culture=neutral" />
  </assemblyBinding>
</runtime>

Ошибка все та же. NHibernate не может найти класс NHibernate.ByteCode.Castle.ProxyFactoryFactory

Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 30 августа 2010

Я действительно нашел решение здесь: .NET-конфигурация привязки игнорируется в machine.config

Проблема заключалась в том, что я пытался перенаправить сборку в GAC из файла machine.config. Похоже, это игнорируется. Следующие две записи в файле web.config сделали свое дело:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <qualifyAssembly partialName="NHibernate.ByteCode.Castle" fullName="NHibernate.ByteCode.Castle,version=2.1.2.4000,publicKeyToken=aa95f207798dfdb4,culture=neutral" />
    <qualifyAssembly partialName="BusinessLogic" fullName="BusinessLogic,version=2.0.0.0,publicKeyToken=e1ee7b158bf26e98,culture=neutral"/>
  </assemblyBinding>
</runtime>

Мне нужно будет добавить эти записи в файл конфигурации каждого приложения, использующего мою бизнес-логику. Но теперь он работает со сборками GAC.

0 голосов
/ 30 августа 2010

Nhibernate.ByteCode. * Сборки загружаются динамически (они не упоминаются как стандартные сборки), и Nhibernate ищет их в каталоге приложения.Если вы хотите, вы можете проверить исходный код NHibernate, чтобы точно знать, как файлы найдены.

Вы можете добавить что-то вроде этого к событию посткомпоновки в Visual Studio:

xcopy $(SolutionDir)SharedLibs\Bytecode.dll $(ProjectDir)$(OutDir) /Y /C
...