来源: 未能加载文件或程序集,或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配-坤哥网
我们在开发中经常会出现程序引用不匹配的问题。
下面是遇到的一个具体实例:
InnerException = {“未能加载文件或程序集“log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=1b44e1d426115821”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)”:”log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=1b44e1d426115821″}
项目引用的是 2.0.8.0 版本。
这个实例刚开始压根没找到原因,因为在配置文件中的程序集并没有配置:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> </assemblyBinding>
原来项目中引用的另外的 dll 引用了 老版本的 log4net。
把项目中的引用的 log4net 改成老版本,但是有其他的引用又引用了新版本的 log4net,真是头大:
log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [KafkaAppender] of type [Cn.Vcredit.ELK.LogAppender.Log4NetForKFKExt.Appender.KafkaAppender, Cn.Vcredit.ELK.LogAppender]. Reported error follows. System.IO.FileLoadException: 未能加载文件或程序集“log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) 文件名:“log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a” 在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) 在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) 在 System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) 在 log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase) 在 log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase) 在 log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement) === 预绑定状态信息 === 日志: DisplayName = log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a (Fully-specified) 日志: Appbase = file:///D:/svn/Loan/trunk/VBS_Console/Cn.Vcredit.VBS.BlackStatistics/Cn.Vcredit.VBS.BlackStatistics/bin/Debug/ 日志: 初始 PrivatePath = NULL 调用程序集: Cn.Vcredit.ELK.LogAppender, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null。 === 日志: 此绑定从 default 加载上下文开始。 日志: 正在使用应用程序配置文件: D:\svn\Loan\trunk\VBS_Console\Cn.Vcredit.VBS.BlackStatistics\Cn.Vcredit.VBS.BlackStatistics\bin\Debug\Cn.Vcredit.VBS.BlackStatistics.vshost.exe.Config 日志: 使用主机配置文件: 日志: 使用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 的计算机配置文件。 日志: 策略后引用: log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a 日志: 尝试下载新的 URL file:///D:/svn/Loan/trunk/VBS_Console/Cn.Vcredit.VBS.BlackStatistics/Cn.Vcredit.VBS.BlackStatistics/bin/Debug/log4net.DLL。 警告: 比较程序集名称时发生不匹配: 主版本 错误: 未能完成程序集的安装(hr = 0x80131040)。探测终止。 log4net:ERROR XmlHierarchyConfigurator: Appender named [KafkaAppender] not found.
如何解决这个问题呢?
方案一:
这种情况可以让两个版本共存,如果是 publicKeyToken 需要使用两个 dependentAssembly 节点。
如何获取 publicKeyToken(公钥标记) 值,只需要使用 SN 命令即可,找到 SN.exe 程序,可以使用搜索工具找到,如下:
选择一个比如:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64
打开命令窗口,定位到这个目录,使用命令 SN -T “dll的路径”:
在项目的配置文件中找到 assemblyBinding 节点下面添加 dependentAssembly:
<dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" /> <codeBase version="1.2.10.0" href="bin\Debug\log4netdll\1_2_10\log4net.dll" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" /> <codeBase version="2.0.8.0" href="bin\Debug\log4netdll\2_0_8\log4net.dll" /> </dependentAssembly>
方案二:
将引用的dll中对目标dll的引用改成统一版本。