来源: .net/c# 引用dll版本冲突解决办法_.Net/C#_架构师_程序员
未能加载文件或程序集“Common.Logging, Version=2.1.1.0, Culture=neutral, PublicKeyToken=af08829b84f0328e”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集“Common.Logging, Version=2.1.1.0, Culture=neutral, PublicKeyToken=af08829b84f0328e”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
源错误:
执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
程序集加载跟踪: 下列信息有助于确定程序集“Common.Logging, Version=2.1.1.0, Culture=neutral, PublicKeyToken=af08829b84f0328e”未能加载的原因。
有时候,我们会看到上面的错误。
错误原因
A项目引用了xxx.dll,B项目也引用了xxx.dll,A项目引用了B项目,如下图:
A项目和B项目都引用了xxx.dll,但是,A项目引用的是高版本的dll,B项目引用的是低版本的dll,当A项目运行的时候,就会报错,找不到低版本的dll
解决办法
利用<bindingRedirect>元素,将一个程序集版本重定向到另一个版本。
oldVersion
- 必需的特性
- 指定最初请求的程序集的版本。 程序集版本号的格式是major.minor.build.revision。 该版本号的每个部分的有效值介于 0 和 65535 之间。
- 你还可以按下列格式指定版本范围:
- n.n.n.n-n.n.n.n
newVersion
- 必需的特性。
- 指定要使用而不是最初请求的版本格式的程序集的版本: n.n.n.n
- 此值可以指定 oldVersion 之前的版本。
文档链接:https://docs.microsoft.com/zh-cn … ingredirect-element
官方例子:
- <configuration>
- <runtime>
- <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″>
- <dependentAssembly>
- <assemblyIdentity name=”myAssembly”
- publicKeyToken=”32ab4ba45e0a69a1″
- culture=”neutral” />
- <bindingRedirect oldVersion=”1.0.0.0″
- newVersion=”2.0.0.0″/>
- </dependentAssembly>
- </assemblyBinding>
- </runtime>
- </configuration>
复制代码
所以,我的解决办法是在web.config设置如下:
- <dependentAssembly>
- <assemblyIdentity name=”Common.Logging” publicKeyToken=”af08829b84f0328e” culture=”neutral” />
- <bindingRedirect oldVersion=”0.0.0.0-3.3.1.0″ newVersion=”3.3.1.0″ />
- </dependentAssembly>