基于.NET Framework4.6的WCF服务升级Enterprise Library后加载程序集失败
这种程序集加载失败的问题在跨版本升级Enterprise Library时真的很容易踩坑,结合你的情况,核心原因是组件版本不兼容——你把Common升到了6.0.1304.0,但Caching组件还停留在5.0.505.0,而旧版本的Caching依赖的是Common 5.x,运行时就会找不到它需要的Common版本,从而抛出错误。
下面是一步步的解决方案:
优先统一所有Enterprise Library组件的版本
Enterprise Library的各个组件(Common、Caching、Logging)是强耦合的,尽量保持它们处于同一个大版本(比如全部升级到6.x)。你可以:- 打开项目的NuGet包管理器,卸载现有的
Microsoft.Practices.EnterpriseLibrary.Caching(5.0.505.0版本) - 安装与Common同版本的Caching包(也就是6.0.1304.0),同时确保Logging组件也是6.x的同版本
这样从根源上避免版本依赖冲突。
- 打开项目的NuGet包管理器,卸载现有的
如果必须保留旧版本Caching,配置绑定重定向
要是因为业务限制不能升级Caching,那需要在项目的app.config或web.config里添加程序集绑定重定向,让运行时把对Common 5.x的请求自动转向到你已安装的6.0.1304.0版本:
在<runtime>节点下添加这段配置:<dependentAssembly> <assemblyIdentity name="Microsoft.Practices.EnterpriseLibrary.Common" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.1304.0" newVersion="6.0.1304.0" /> </dependentAssembly>注意:公钥Token要和你引用的Common程序集一致,Enterprise Library的官方组件公钥Token基本都是
31bf3856ad364e35,可以右键项目里的Common引用→属性查看确认。清理项目残留,重新生成
旧的编译文件可能会残留旧版本的dll,导致冲突:- 右键解决方案→选择「清理解决方案」
- 手动删除项目下的
bin和obj文件夹 - 重新生成整个解决方案
检查项目引用和配置一致性
- 确认所有Enterprise Library组件的引用都是通过NuGet安装的,没有手动添加的本地dll(这类旧dll很容易藏坑)
- 如果你的WCF服务配置里用到了Logging组件(比如自定义行为、日志监听),要确保配置里的type属性中的版本号和实际引用的一致,比如:
这里的版本号要和你安装的Logging版本完全匹配。<behaviorExtensions> <add name="loggingBehavior" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingBehaviorExtensionElement, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.1304.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </behaviorExtensions>
另外提醒下,Enterprise Library 6相对于5.x有一些API变更,如果后续出现编译错误,可能需要调整部分代码,但先解决当前的运行时加载问题是优先级最高的。
内容的提问来源于stack exchange,提问作者Amit

