在同一解决方案中引用2个不同版本的log4net

Joe*_*eau 77 .net nhibernate dll log4net

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

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

我猜大多数问题都来自于log4net已经改变了它的汇编密钥.我尝试使用绑定重定向但没有成功:2个DLL没有相同的密钥.

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

处理这个问题的最佳方法是什么?是否有可能解决?

Joe*_*eau 147

我通过对类似问题的回答找到了解决方案

您可以在项目中为每个版本的log4net创建一个文件夹.通过将该文件添加到解决方案(而不是添加引用),将每个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>
Run Code Online (Sandbox Code Playgroud)

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

  • 我不确定我是否得到了这个:如果没有引用log4net,你怎么不编译错误? (12认同)
  • @guidupy你可以引用你的代码使用的log4net,但是关闭属性中的copyLocal. (4认同)
  • 对于未来的读者(我从另一个答案中找到的提示,但谨慎地发布在这里)...对于web应用程序(asp.net),引用有一个调整:<codeBase version ="1.0.0.0"href ="bin\folder \namedll.dll"/> (4认同)
  • 这似乎也适用于我。我从发生冲突的项目的参考列表中删除了 log4net。此外,由于 log4net.dll 不在我的 bin 文件夹中,我的 href 路径看起来更像是“..\..\..\..\Lib\NHibernate-2.0.1.GA\log4net.dll”——只是一个使用我们的构建系统,log4net 在每个开发者机器上的相对路径。 (2认同)
  • 这很棒,它可以解决其他情况,其中简单的绑定重定向也会因API更改而破坏事情! (2认同)

Joe*_*erg 7

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

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
Run Code Online (Sandbox Code Playgroud)

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