我有一个控制台应用程序c#项目依赖于NHibernate 3.3.2和ShapArch.NHibernate 2.0.4.628,它已经用NHibernate 3.3.1编译(据我所知 - 我可能错了,但是当我创建了一个2.0.4 SharpArch项目它通过Nuget下载了NH 3.3.1。
当引用的dll为3.3.2.4000时,为什么Visual Studio将NHibernate显示为版本3.3.1.4000?对于所有引用,“特定版本”属性都设置为false。 SharpArch的版本出现在VS 2.0.0.0而不是2.0.4,即文件/产品版本。
在app配置中,我有:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.1.4000" newVersion="3.3.2.4000" />
</dependentAssembly>
</assemblyBinding>
</runtime>
该应用无法加载:
System.IO.FileLoadException was unhandled
Message=Could not load file or assembly 'NHibernate, Version=3.3.2.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Source=MyApp.ResourcesGenerator
FileName=NHibernate, Version=3.3.2.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
FusionLog=""
StackTrace:
at MyApp.ResourcesGenerator.Program.InitializeNHibernateSession()
at SharpArch.NHibernate.NHibernateInitializer.InitializeNHibernateOnce(Action initMethod) in d:\Builds\SharpArch2\Solutions\SharpArch.NHibernate\NHibernateInitializer.cs:line 54
at MyApp.ResourcesGenerator.Program.Initialize() in C:\projects\tc\Trunk\Source_LibsUpgrade\Applications\PerformanceManagement\MyApp.ResourcesGenerator\Program.cs:line 149
at MyApp.ResourcesGenerator.Program.Main(String[] args) in C:\projects\tc\Trunk\Source_LibsUpgrade\Applications\PerformanceManagement\MyApp.ResourcesGenerator\Program.cs:line 31
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.IO.FileLoadException
Message=Could not load file or assembly 'NHibernate, Version=3.3.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
FileName=NHibernate, Version=3.3.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
我甚至不确定为什么在使用3.3.1编译尖锐架构时它会尝试加载3.3.0.4000。
答案 0 :(得分:11)
NHibernate 3.3.2.GA的文件版本为3.3.2.4000,但程序集版本仍为3.3.1.4000。这样做是为了允许升级NHibernate而不需要绑定重定向。所有未来NHibernate的次要版本升级也将遵循这种模式。
所以解决方案就是删除绑定重定向。
这里令人困惑的部分是Windows资源管理器仅显示文件和产品版本,但Visual Studio仅显示程序集版本。