NHibernate3.2之后对于NHibernate.ByteCode.Castle的兼容报错

  今天对项目升级,由原来的NHibernate 3.1.0.4000升到了3.3.0.4000版本,编译没有问题,结果在测试的时候就出现了悲催的一幕,错误是:未能加载文件或程序集"NHibernate, Version=3.1.0.4000, Culture=neutral,PublicKeyToken=aa95f207798dfdb4"或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自HRESULT:0x8013104)。具体截图如下:

nhibernateerror

  从报错来看,应该是NHibernate的版本在什么地方引用不对。所以第一想法就是用文本搜索整个项目的目录,将原来的关于3.1版本的全部替换成了3.3。但调试依然不过。错误依然。这就麻烦了,但可以肯定的是,还是引用出问题,因此只好静心看看错误信息了,在黄花花的页面中,找到堆栈数据,堆栈中有一点:

[UnableToLoadProxyFactoryFactoryException: 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.

  UnableToLoadProxyFactoryFactoryException:xxxxxx,这一堆告诉我们,NHibernate.ByteCode.Castle.ProxyFactoyFactory出了问题,那么就没有理由不看它了,后面详细中有两点,其一:NHibernate.Bytecode provider assembly 没有部署,其二:proxyfactory.factory_class属性格式有问题。其他都未改动,只能是NHibernate.ByteCode.Castle和NHibernate新版的兼容问题了。有了方向,得找出路,就是看看NHibernate新版中,是需要那个版本的NHibernate.ByteCode.Castle。

  结果比较意外,在3.2以后的NHibernate中已经自带了proxy generator,因此无需另外的NHibernate.ByteCode.LinFu.dll or NHibernate.ByteCode.Castle.dll了,那这个问题既然如此,就好解决了。直接将属性值替换就好了:

        <property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property>
        <!--
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
        -->

  编译,运行。一切恢复平静。

  本来以为很简单的事情,毕竟这档子事情干的太多。不过这次弄下来,花费了近两个小时,开始一直纠结在引用的问题,反而忽略了黄页里面的错误内容,搞得Clear了项目,清除了缓存,一直还不能解决。最后不得不回过头来看黄页。经验有的时候也是块绊脚石啊!

Saturday, December 29, 2012 | .NET技术 NHibernate

文章评论

No comments posted yet.

发表评论

Please add 3 and 6 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。