【问题标题】:Referencing 2 different versions of log4net in the same solution在同一解决方案中引用 2 个不同版本的 log4net
【发布时间】:2017-08-18 22:07:31
【问题描述】:

我正在使用引用 log4net 1.2.10.0 的 NHibernate 2.1.2.400。 在同一个项目中,我也使用了简单的会计SDK,遗憾的是它仍然使用log4net 1.2.9.0。

因此,如果我引用 log4net 1.2.10.0 但 simpleSDK 不起作用,我可以让 NHibernate 工作。反之亦然...

我猜大部分问题都来自 log4net 更改了它的汇编密钥这一事实。我尝试使用绑定重定向但没有成功:这 2 个 DLL 没有相同的密钥。

我正在考虑重新编译 NHibernate 以使用 log4net 1.2.9.0,但这似乎是错误的做法,我的感觉是,Simply Accounting 不会很快更新他们的 SDK 以使用 log4net 1.2.10.0。

处理此问题的最佳方法是什么?有可能解决吗?

【问题讨论】:

标签: .net nhibernate dll log4net


【解决方案1】:

我通过answer to a similar question找到了解决方案

您在项目中为每个版本的 log4net 创建 2 个文件夹。通过将文件添加到解决方案(而不是添加引用),将每个 log4net.dll 放置在其相应的文件夹中。您可以将复制到输出目录属性设置为始终复制,以便在构建时自动复制到输出文件夹。

然后您通过添加如下内容来修改 app.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>

您可以使用 sn -T [assemblyName] 获取程序集的公钥令牌

【讨论】:

  • 这似乎也对我有用。我从发生冲突的项目的参考列表中删除了 log4net。此外,由于 log4net.dll 不在我的 bin 文件夹中,我的 href 路径看起来更像“..\..\..\..\Lib\NHibernate-2.0.1.GA\log4net.dll”——只是一个使用我们的构建系统,log4net 在每个开发者机器上的相对路径。
  • 我不确定我是否明白这一点:如果未引用 log4net,你怎么不会出现编译错误?
  • 这太棒了,它可以解决其他情况,即简单的绑定重定向也会由于 API 更改而破坏事情!
  • @guidupy 你可以引用你的代码使用的 log4net,但是在属性中关闭 copyLocal。
  • 给未来的读者(我从另一个答案中找到的提示,但在此处发布时要谨慎)......对于网络应用程序(asp.net),参考有一个调整:
【解决方案2】:

您可以向注册表添加排除项。只需添加这些键:

HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,681549d62126b7b8
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,1b44e1d426115821
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,669e0ddf0bb1aa2a

这将使 .net 运行时跳过对列出的程序集的验证。理论上这是一个安全问题,但由于私钥无论如何都是公开的,几乎没有任何影响。

【讨论】:

  • 如您所说,这是一个安全问题。此外,这意味着您必须在每个运行该软件的工作站上进行这些更改。在复杂的企业网络中,这些事情加起来会造成巨大的混乱。我宁愿尽可能避免它。其他解决方案是独立且可移植的。
  • 正如我所说,因为私钥无论如何都是公开的,所以根本不存在真正的安全问题。尤其是在企业网络中,配置单个组策略对象比为使用中的每个 LOB 应用程序配置它更容易。您可以在域级别配置一次,无需再考虑。
【解决方案3】:

如果绑定重定向不起作用并且简单的记帐 SDK 是闭源的,一个可能的解决方案是重新编译 NHibernate 以使用 log4net 1.2.9.0。

【讨论】:

  • 这可以,但必须构建一个特殊版本的 nhibernate 将难以支持...谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多