我该如何解决log4net中不断变化的publickeytoken

我们有一个asp.net 4.0项目,它使用了一些依赖于log4net版本1.2.10.0的框架。 今天我试图包含一个依赖于log4net版本1.2.11.0的新框架,自从:

log4net 1.2.10.0具有publickeytoken = 1b44e1d426115821

log4net 1.2.11.0具有publickeytoken = 669e0ddf0bb1aa2a

由于这些不同,我不能通过web.config中的运行时元素使用程序集redirect(使所有的框架使用相同版本的log4net)或代码库(只有新的框架使用版本1.2.11.0)。

我在这里有什么select?

(以及为什么log4net不断改变版本之间的publickeytokens,据我所知,一个丢失的密钥是1.2.9.0和1.2.10.0之间切换的原因,他们是否失去了关键呢?我会自愿我的保pipe箱保持安全,如果他们需要它…)

编辑:好吧,所以log4net家伙显然有这样的想法,用两个键释放是一个好主意,但这意味着你使用的每个框架需要同意他们喜欢的两种风格中的一种,或者这些框架不能工作在同一个appdomain旁边。 我是唯一一个发现这个可怕的想法吗? 如果每个人都这样做,那么一切都会崩溃,对吧?

Edit2:正如我所说的,我没有在我的业务代码中使用log4net,但我使用了几个依赖于1.2.10.0的框架,并且当我试图使用依赖于1.2.11.0的新框架(新密钥),所以Stefans的回答并不适用,因为新的框架会期望新的关键,而不是旧的关键

这就是我在1.2.11.0版本中的工作。

  1. 诅咒阿帕奇更改密钥的第一个地方:)
  2. 下载使用旧密钥签署的版本1.2.11.0。
  3. 通过删除任何对log4net的直接引用(新密钥)来排除自己的代码,并用对旧密钥签名的程序集的引用进行replace。
  4. 通过在你的web / app.config文件中包含这个段来分类你可能拥有的任何相关程序集
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.2.10.0" newVersion="1.2.11.0"/> </dependentAssembly> </assemblyBinding> </runtime> 

我正在使用通过nuget下载的最新版本的log4net。 但是,我正在使用的一个库需要旧版本。 我的麻烦使我想到了这个问题。

与其他答案的问题是,他们正在使用相同的DLL版本的所有绑定。 我想在新版本中使用除了遗留依赖项之外的其他function。

为了能够做到这一点,你需要做到以下几点:

  1. 首先下载旧版本(版本1.2.11.0)。
  2. 将下载的二进制文件重命名为log4net.1.2.10.dll 。 将其包含在您的启动项目中,将“ 生成”操作设置为“ None ”,并将“如果更新则复制” 在这里输入图像说明
  3. 告诉.NET哪里可以find旧版本:

App.config中

 <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" /> <codeBase version="1.2.10.0" href="log4net.1.2.10.dll" /> </dependentAssembly> </assemblyBinding> </runtime> 

href属性标识旧版本的位置。 因此,log4net的所有其他请求将指向新版本。

您可以下载使用旧密钥签名的log​​4net 1.2.11.0版本。 更改为新密钥的原因在常见问题解答中说明:

http://logging.apache.org/log4net/release/faq.html#two-snks

(基本上新密钥是公开的,由于某种原因,他们不希望在发行版中包含旧密钥,但是我不清楚为什么他们不把旧密钥公开给公众)

不知道它是否适合您的特定情况,但您可以重新编译其中的一个框架,因此它们将使用具有相同公钥的log4net。 在我的情况下,它是使用log4net 1.2.10的FluentNHibernate和使用新密钥与log4net 1.2.11进行组合。 我下载了用旧密钥签名的log​​4net 1.2.11,并用它重新编译了Combress。 之后,添加程序集绑定redirect从1.2.10到1.2.11,并开始工作。

这并不一定适用于所有情况,但是因为使用log4net的项目是OSS,所以我下载了源代码,用我使用的版本replace了log4net的冲突版本,并重build了项目。 在我的情况下,这是Topshelf,所以我现在有一个版本的Topshelf程序集与我使用的相同版本的log4net构build,现在我可以参考两个没有问题。

我试图去上面提供的链接,但似乎Apache网站中的所有链接都不起作用。 那么这就是我所做的解决这个问题的方法:

从Visual Studio中,使用Nuget下载并安装最新版本的log4net(1.2.13.0)。 NuGet软件包pipe理器将自动下载并升级所有的log4net(1.2.11.0)到最新版本。