[.net] 我该如何解决log4net中不断变化的publickeytoken



Answers

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

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

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

  1. 首先Download旧版本(版本1.2.11.0)。
  2. 将下载的二进制文件重命名为log4net.1.2.10.dll 。 将其包含在启动项目中,将Build action设置为None并将其复制为“Copy if newer”
  3. 告诉.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的所有其他请求都将指向新版本。

Question

我们有一个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的人显然有这样的想法,即用两个键释放是一个好主意,但这意味着你使用的每个框架都需要同意他们喜欢的两种风格中的一种,或者那些框架不能工作在同一个应用程序域中。 我是唯一一个发现这是一个可怕的想法? 如果每个人都这样做,那么一切都会崩溃,对吧?

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




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




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

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




Links