当前位置:坤哥网-kwan-未能加载文件或程序集,或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配

未能加载文件或程序集,或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配

2019/6/14 18:20:54 IT综合阅读(575) 评论(0)


我们在开发中经常会出现程序引用不匹配的问题。

下面是遇到的一个具体实例:

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 程序,可以使用搜索工具找到,如下:

2e8bcfc2-4308-4d73-ac36-ac5d98ff55c8.png

选择一个比如:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x6464e2fe5f-6786-4dcc-8ede-e9c781c9531a.png

打开命令窗口,定位到这个目录,使用命令 SN -T "dll的路径":20e5eb6c-48d9-4fda-a690-853ac4cf589e.png

在项目的配置文件中找到 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的引用改成统一版本。

标签: 程序引用
分类: .net

发表评论 没有账号,注册评论