如何使用具有不同log4net版本要求的两个不同NuGet包

本文关键字:两个 NuGet 何使用 log4net 版本 | 更新日期: 2023-09-27 18:05:39

我正在做一个项目,我们包括UmbracoCms NuGet包,它内部使用log4net框架版本1.2.11来执行日志记录。现在我们想添加另一个包(SharpRaven.Log4Net),它依赖于log4net 1.2.15。仅仅安装第二个NuGet包就会产生一个异常:

Could not load file or assembly 'log4net, Version=1.2.11.0, Culture=neutral, 
PublicKeyToken=null' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from 
HRESULT: 0x80131040)

这显然是因为Umbraco引用了1.2.11版本,而我的项目现在引用了1.2.15版本,但我如何解决这个问题?我不能:

  • 更改任何一个包的版本要求(真的不愿意从源代码构建它们)
  • 将两个引用添加到我的项目中,因为它们是相同的组件(VS不允许)
  • 删除1.2.15版本,添加1.2.11版本。这给了我同样的错误,但随后与其他版本号。
  • 创建bindingRedirect,因为所需的log4net版本没有publicToken。

我真的没有看到任何其他的选择,所以任何帮助将不胜感激。

更新以澄清为什么它不是3158928的重复问题

我想强调的是,这里的问题是由NuGet包引用的log4net程序集有一个PublicKeyToken的null。早先的问题张贴在这里参考2个不同版本的log4net在相同的解决方案有一些很好的答案,但没有这个问题,因此不回答这个问题。

如何使用具有不同log4net版本要求的两个不同NuGet包

您可以像下面这样并排运行log4net版本:

基本上你为每个版本创建一个文件夹,然后将它绑定到你的config:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="681549d62126b7b8" />
        <codeBase version="1.2.9.0" href="log4netv1.2.9.0'log4net.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
        <codeBase version="1.2.10.0" href="log4netv1.2.10.0'log4net.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
        <codeBase version="1.2.11.0" href="log4net.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>