无法在NHibernate中加载文件或程序集

我最近在hibernate.cfg.xml文件中遇到了一些问题,因为我没有使用以下行。

 NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle 

现在,这是固定的,我得到以下错误。

无法加载文件或程序集’NHibernate,Version = 2.1.0.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4’或其依赖项之一。 定位的程序集的清单定义与程序集引用不匹配。 (HRESULTexception:0x80131040)

为什么我会收到此错误,如何解决?

这些文件应与引用的文件NHibernate.dll位于同一目录中:

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

你也应该添加一个引用或复制这个引用:

  • NHibernate.ByteCode.Castle.dll

我假设您最近将NHibernate升级到2.1?

如果是这样,我猜你有不同的项目引用不同版本的NHibernate。

这发生在我身上,比你想象的更难追查。

这些是我为解决它而采取的步骤:

  1. 删除项目中所有bin目录中的所有文件。 通常,Clean Solution适用于此,但事实并非如此,您可能需要通过命令行调用或手动执行此操作
  2. 编辑所有.csproj文件。 使用文本编辑器编辑它们或执行卸载项目然后编辑.csproj文件。
  3. 确保所有HintPath节点都指向DLL的相同(新)版本

希望能为您解决这个问题。

作为未来参考:如果您遇到Randy Klingelheber指出的相同问题(NHibernate和FluentNHibernate之间的依赖性问题,或任何其他依赖库),您可以为针对旧版本的程序集指定重定向。 这可以防止必须重新编译依赖程序集。

         

此代码将旧版本(在我的情况下为3.0.0.3001)的请求重定向到实际使用的版本(3.0.0.4000)。 publicKeyToken包含在错误消息中。

我也有这个问题。

对我来说,问题是FluentNHibernate期望NHibernate的不同版本(2.1.0.4000)比我在项目中所包含的版本(2.1.2.4000)。 我通过单独下载每个库的最新版本偶然发现了这一点。

为了解决这个问题,我将NHibernate引用更改为指向FluenNHibernate 1.0 RTM(2.1.0.4000)附带的旧版NHibernate。

另一种解决方案可能是从app.config文件中显式设置程序集绑定。

我最近使用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项目中。 这有效……但仅限于开发……

当我将Web应用程序发布到我们的客户验收测试服务器(在TeamCity的帮助下自动发生以及包含对aspnet_compiler.exe的调用的脚本)时,NHibernate.ByteCode.Castle.dll无处可寻。

我不确定为什么会发生这种情况,但我怀疑它与我们的应用程序中的任何代码实际上都没有调用该特定dll中的代码这一事实有关。 此外,还有(如果我错了,请纠正我)没有从NHibernate.dll到NHibernate.ByteCode.Castle的硬编码引用,所以在某个地方(可能是未使用的)dll被忽略了。

第二个(也是成功的)尝试是将缺少的dll的引用直接添加到Web项目中。 现在,我可以删除我在第一次尝试中添加的引用而没有任何问题。

(我不是特别喜欢在那个特定项目中有这样的参考,但是嘿!):-)

就我而言,“清洁解决方案”,其次是“重建解决方案”解决了这个问题。

您可能有代码引用两个不同版本的NHibernate DLL。 您使用NHibernate下载的NHibernate.dll可能与您使用Castle ActiveRecord下载的版本不同。 尽量坚持使用NHibernate.ByteCode.Castle附带的NHibernate DLL版本。 并确保您的GAC中没有NHibernate DLL(任何版本)(至少在您解决此问题之前)。

将NHibernate升级到3.0后,我遇到了这个问题,使用NH 3.0将Spring升级为每晚构建。 问题是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文件。

我刚刚遇到这种情况 – 在我的情况下,这是我第一次尝试NHibernate(和Fluent NHibernate)。 我已经在.dll程序集中实现了我的大多数应用程序,由一个单独的可执行程序集引用。 可执行文件没有直接引用NHibernate,它给了我错误。

我正在使用NuGet来下载Fluent NHibernate,所以我也将Fluent NHibernate引用添加到可执行程序集中。 感觉不是很干净,但它将依赖项放入.bin文件夹并解决错误。 (有趣的是它不会(似乎?)与其他库一起发生,比如NLog)

我面临同样的问题。 我清除了“临时互联网文件”,这个问题就消失了。

你应该引用依赖程序集(我猜它是“NHibernate.ByteCode.Castle”)并将它们的“copy local”属性设置为true。

除了nhibernate.dll之外,NHibernate还有一些其他程序集。 你有没有(来自同一版本)?

您的解决方案中可能有不同的项目。 这些项目可能引用了不同版本的NHibernate.dll。 检查所有项目中的版本并重建项目

看起来NHibernate dll没有被复制到应用程序的bin目录中。 确保它已被引用并存在于bin目录中。