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

时间:2010-07-01 14:51:27

标签: .net nhibernate dll log4net

我正在使用引用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。

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

3 个答案:

答案 0 :(得分:143)

我使用此answer to a similar question

找到了解决方案

您可以在项目中为每个版本的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>

您可以使用sn -T [assemblyName]

获取程序集的公钥标记

答案 1 :(得分: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

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

答案 2 :(得分:3)

如果绑定重定向不起作用且简单会计SDK是封闭源,则可能的解决方案是重新编译NHibernate以使用log4net 1.2.9.0。