我如何解决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中的运行时元素使用程序集重定向(使所有框架使用相同版本的log4net)或代码库(仅使新框架使用版本1.2.11.0) .

我有什么选择?

(以及为什么哔哔声会让log4net不断更改版本之间的publickeytokens,因为据我所知,丢失的密钥是在1.2.9.0和1.2.10.0版本之间切换的原因,他们是否再次丢失密钥?我会自愿提供我的Dropbox如果他们需要它,以保证安全......)

编辑:好的,所以log4net的人显然认为用两个密钥发布是一个好主意,但这意味着你使用的每个框架需要就他们喜欢的两种风格中的哪一种达成一致,或者那些框架不能正常工作在同一个应用程序域中 . 我是唯一发现这个可怕想法的人吗?如果每个人都这样做,那么一切都会崩溃,对吧?

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

回答(6)

2 years ago

这就是我使用1.2.11.0版本的方法 .

  • 诅咒apache在第一时间更改密钥:)

  • Download使用旧密钥签名的1.2.11.0版本 .

  • 通过删除对log4net(新密钥)的任何直接引用来排除您自己的代码,并替换为使用旧密钥签名的程序集的引用 .

  • 通过在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>

2 years ago

我正在使用我通过nuget下载的最新版本的log4net . 但是,我使用的其中一个库需要旧版本 . 我的烦恼引发了我这个问题 .

其他答案的问题是它们对所有绑定使用相同的dll版本 . 我希望将新版本中的功能用于除遗留依赖之外的所有其他功能 .

为此,您需要执行以下操作:

  • downloading旧版本(版本1.2.11.0)开始 .

  • 将下载的二进制文件重命名为 log4net.1.2.10.dll . 将Build操作设置为 None 和"Copy if newer"
    enter image description here
    将其包含在启动项目中

  • 告诉.NET它可以找到旧版本:

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的所有其他请求将指向新版本 .

2 years ago

您可以下载使用旧密钥签名的log4net 1.2.11.0版本 . 改为新密钥的原因在他们的FAQ中解释:

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

(基本上新密钥是公开的,并且由于某种原因他们不想在分发中包含旧密钥 . 我不清楚为什么他们不仅仅公开旧密钥)

2 years ago

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

2 years ago

这不一定适用于所有情况,但因为使用log4net的项目是OSS我下载了源代码,用我正在使用的版本替换了冲突版本的log4net并重建了项目 . 在我的情况下它是Topshelf,所以我现在有一个版本的Topshelf程序集,使用我正在使用的相同版本的log4net构建,现在我可以毫无问题地引用它们 .

2 years ago

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

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