NHibernate无法从GAC加载程序集(NHibernate.ByteCode.Castle和BusinessLogic)

时间:2010-08-30 08:10:44

标签: c# asp.net nhibernate business-logic

我在互联网上寻找我的这个特殊问题。我找到了一些建议的解决方案,但它们不起作用。

以下是设置:

我正在使用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的本地副本放入ASP.NET应用程序的bin文件夹中,则错误消失。但是出现了一个新的错误。它说NHibernate无法在BusinessLogic.dll中找到类(例如Product等)。

如果我将BusinessLogic.dll的本地副本放入ASP.NET应用程序的bin文件夹中,即使修复了此错误,并且应用程序运行良好。

然而,这不是必需的,因为每当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 个答案:

答案 0 :(得分:3)

我实际上在这里找到了解决方案:.NET assemblyBinding configuration ignored in machine.config

问题是我试图从machine.config文件中重定向到GAC中的程序集。它看起来像被忽略了。 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的程序集。

答案 1 :(得分:0)

Nhibernate.ByteCode。*程序集是动态加载的(它们不作为标准程序集引用),Nhibernate在应用程序目录中查找它们。 如果你想要,你可以选择NHibernate源来确定文件是如何被找到的。

您可以在visual studio中的post build事件中添加类似这样的内容:

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