Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何解决log4net不断更改publickeytoken的问题_.net_Dll_Log4net_Publickeytoken - Fatal编程技术网

.net 如何解决log4net不断更改publickeytoken的问题

.net 如何解决log4net不断更改publickeytoken的问题,.net,dll,log4net,publickeytoken,.net,Dll,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中的runtime元素使用程序集重定向(使所有框架使

我们有一个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中的runtime元素使用程序集重定向(使所有框架使用相同版本的log4net)或代码库(使新框架仅使用版本1.2.11.0)

我的选择是什么

(为什么bleep会让log4net在版本之间不断更改publickeytokens,据我所知,丢失的密钥是版本1.2.9.0和1.2.10.0之间切换的原因,他们是否又丢失了密钥?如果他们需要,我会自愿让我的dropbox保持安全…)

编辑:好的,log4net的人显然认为用两个键发布是个好主意,但这意味着你使用的每个框架都需要就他们喜欢的两种风格中的哪一种达成一致,否则这些框架不能在同一个appdomain中并排工作。我是唯一一个觉得这是个可怕的想法的人吗?如果每个人都这样做,那么一切都会崩溃,对吗


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

您可以下载使用旧密钥签名的log4net 1.2.11.0版本。他们的常见问题解答中解释了将密钥更改为新密钥的原因:


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

这就是我如何使用1.2.11.0版的原因

  • 首先诅咒apache更改密钥:)
  • 使用旧密钥签名的1.2.11.0版本
  • 通过删除对log4net(新密钥)的任何直接引用来整理您自己的代码,并替换为对使用旧密钥签名的程序集的引用
  • 通过将此段包含在web/app.config中,整理出您可能拥有的任何从属程序集
  • 
    
    这并不一定在所有情况下都有效,但因为使用log4net的项目是OSS,所以我下载了源代码,用我使用的版本替换了冲突的log4net版本,并重建了项目。在我的例子中,它是Topshelf,所以我现在有一个版本的Topshelf程序集,它是用我正在使用的同一版本的log4net构建的,现在我可以毫无问题地引用这两个版本。

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

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

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

    要做到这一点,您需要执行以下操作:

  • 从旧版本(1.2.11.0版本)开始
  • 将下载的二进制文件重命名为
    log4net.1.2.10.dll
    。将其包含在启动项目中,并将生成操作设置为
    None
    和“如果更新,请复制”
  • 告诉.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的所有其他请求都将指向新版本。

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


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

    但是当我使用绑定到新密钥的第三方库时,我仍然被卡住(对吗?)。使用新的log4net不是我的选择,它是第三方框架。随着越来越多的框架开始使用log4net和新的键(不幸的是,这个键是正确的),我看不出这个东西怎么会不会在每个人的脸上爆炸。我猜你需要考虑不让所有的组件使用Log4NET的相同版本…我该怎么做呢?net中是否有处理此问题的机制?是的,存在:下载使用旧公钥签名的版本是必要的,因为很遗憾,无法使用不同的公钥执行绑定重定向到程序集。由于1.2.11.0中的重大更改,这似乎失败了:是否有人找到了@sydneyos提到的链接中描述的导致以下异常:
    未找到方法:“Void log4net.Config.BasicConfigurator.Configure()”
    很遗憾,除了降级到1.2.10之外,没有其他解决方案。(或重新编译您使用的每个依赖程序集)。将1.2.10程序集放在不同的目录中并使用此配置