无法在NHibernate中加载文件或程序集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在NHibernate中加载文件或程序集相关的知识,希望对你有一定的参考价值。
我最近在hibernate.cfg.xml
文件中遇到了一些问题,因为我没有使用以下行。
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
现在,这是固定的,我得到以下错误。
无法加载文件或程序集'NHibernate,Version = 2.1.0.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)
为什么我会收到此错误以及如何解决?
这些文件应与引用的文件NHibernate.dll位于同一目录中:
Antlr3.Runtime.dll
Iesi.Collections.dll
log4net.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
你也应该添加一个引用或复制这个引用:
- NHibernate.ByteCode.Castle.dll
我面临同样的问题。我清除了“临时互联网文件”,这个问题就消失了。
你应该引用依赖程序集(我猜它是“NHibernate.ByteCode.Castle”)并将它们的“copy local”属性设置为true。
除了nhibernate.dll
之外,NHibernate还有一些其他组件。你有没有(来自同一版本)?
您的解决方案中可能有不同的项目。这些项目可能引用了不同版本的NHibernate.dll。检查所有项目中的版本并重建项目
看起来NHibernate dll没有被复制到应用程序的bin目录中。确保它已被引用并存在于bin目录中。
我假设您最近将NHibernate升级到2.1?
如果是这样,我猜你有不同的项目引用不同版本的NHibernate。
这发生在我身上,比你想象的更难追查。
这些是我为解决它而采取的步骤:
- 删除项目中所有bin目录中的所有文件。通常,Clean Solution适用于此,但事实并非如此,您可能需要通过命令行调用或手动执行此操作
- 编辑所有.csproj文件。使用文本编辑器编辑它们或执行卸载项目然后编辑.csproj文件。
- 确保所有HintPath节点都指向DLL的相同(新)版本
希望能为您解决这个问题。
作为未来参考:如果您遇到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
包含在错误消息中。
我也有这个问题。
对我来说,问题是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
..ReferenceAssembliesNHibernate.dll
..ReferenceAssembliesFluentNHibernate.dll
ReferenceAssemblies
(所有外部DLL都驻留在ReferenceAssemblies目录中。)
我第一次尝试解决这个问题是通过向DataAccess项目添加对NHibernate.ByteCode.Castle.dll的引用。这工作......但仅限于开发......
当我将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后,我遇到了这个问题,将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文件。
我刚刚遇到这种情况 - 在我的情况下,这是我第一次尝试NHibernate(和Fluent NHibernate)。我已经在.dll程序集中实现了我的大多数应用程序,由一个单独的可执行程序集引用。可执行文件没有直接引用NHibernate,它给了我错误。
我正在使用NuGet来下载Fluent NHibernate,所以我也将Fluent NHibernate引用添加到可执行程序集中。感觉不是很干净,但它将依赖项放入.bin文件夹并解决错误。 (有趣的是它不会(似乎?)与其他库一起发生,比如NLog)
以上是关于无法在NHibernate中加载文件或程序集的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Azure Functions 中加载文件或程序集“Microsoft.Extensions.Configuration.Abstractions,版本=5.0.0.0
无法在引用类库的 azure 函数中加载文件或程序集“System.Data.Entity 4.0.0.0”
无法使用表存储在 Azure 云工作者角色中加载文件或程序集 Microsoft.Data.OData 版本 = 5.2.0.0 错误