问题1描述
- 从ABP官方网站下载标准模版后,进行EF的数据迁移
- 一直报错“Castle.Core 4.0.0.0”版本未能加载具体情况下下图
尝试方法
- 去掉Caste.Core的引用,重新加载,然后执行迁移命令【不可行】
- 按网上这篇文章程序集清单定义与程序集引用不匹配分析及解决的方法,修改APP.Config文件,执行迁移命令【可以解决,但是感觉有点滞后了】配置代码见下:
<dependentAssembly>
<assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
- 简单粗暴的做法,去掉Castle.Core的引用 执行迁移命令【解决】
- 原因分析
- EntityFramework层中并未直接使用Castle.Core,去掉后重新生成不报错
- 原因分析
学习到的经验
- CLR加载DLL的策略
- 配置文件管理与程序集的引用版本重定向
assemblyBinding
节点下的配置说明- 配置代码
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="AuxFiles;binsubdir"/> <dependentAssembly> <assemblyIdentity name="JeffTypes" publicKeyToken="32ab4ba45e0a69a1" culture="neutral"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> <codeBase version="2.0.0.0" href="http://www.wintellect.com/JeffTypes.dll"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="TypeLib" publicKeyToken="1f2e74e897abbcfe" culture="neutral"/> <bindingRedirect oldVersion="3.0.0.0-3.5.0.0" newVersion="4.0.0.0"/> <publisherPolicy apply="no"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
- 第一个dependentAssembly,assemlyIdentity和bindingRedirect元素查找由控制着公钥标记32ab4ba45e0a69a1的那个组织发布的、语言文化中性的JeffTypes程序集的1.0.0.0版本时,改为定位同一个程序集的2.0.0.0版本。
- codeBase元素 查找由控制着公钥标记32ab4ba45e0a69a1的组织发布的、语言文化为中性的JeffTypes程序集的2.0.0.0版本时,尝试在以下URL处发现它:http://www.Wintellect.com/JeffTypes.dll。虽然第2章没有特别指出,但codeBase元素也能用于弱命名程序集。在这种情况下,程序集的版本号会被忽略,而且根本就不应该在XML codeBase元素中写这个版本号。此外,codeBase所定义的URL必须引用应用程序基目录下的一个子目录。
- 第2个dependentAssembly,assemblyIdentity和bindingRedirect元素 查找由控制着公钥标记1f2e74e897abbcfe的那个组织发布的、语言文化中性的TypeLib程序集的3.0.0.0到3.5.0.0版本时(包括3.0.0.0和3.5.0.0在内),改为定位同一个程序集的4.0.0.0版本。
- publisherPolicy元素 如果生成TypeLib程序集的组织部署了一个发布者策略文件,CLR应该忽略该文件。