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


80

我正在使用引用log4net 1.2.10.0的NHibernate 2.1.2.400。在同一项目中,我还使用了简单的记账SDK,可悲的是它仍在使用log4net 1.2.9.0。

因此,如果我引用log4net 1.2.10.0,但我可以使NHibernate正常工作,但是simpleSDK无法正常工作。反之亦然...

我猜大多数问题都来自log4net更改了其组装密钥这一事实。我尝试使用绑定重定向没有成功:2个DLL没有相同的密钥。

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

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


2
我在stackoverflow.com/questions/1744543/上有一个非常类似的问题,我求助于重新编译。我猜这是dll-hell v2.0的问世。
SandorDrieënhuizen10年

1
在检查您的问题时,我发现stackoverflow.com/questions/2460542/2461746#2461746解决了我的问题。
Joel Gauvreau'7年

大!我一直在想让CLR在不同的位置显示,而href属性似乎可以解决问题。感谢您指出了这一点!
SandorDrieënhuizen10年

Answers:


149

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

您在项目中为每个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]获取程序集的公钥令牌。


2
这似乎也对我有用。我从发生冲突的项目的“引用”列表中删除了log4net。此外,由于log4net.dll不在我的bin文件夹中,因此我的href路径看起来更像是“ .. \ .. \ .. \ .. \ Lib \ NHibernate-2.0.1.GA \ log4net.dll”,只是使用我们的构建系统,每个开发人员的机器上log4net所在的相对路径。
jyoungdev

12
我不确定是否得到此消息:如果未引用log4net,如何不会出现编译错误?
guidupuy 2012年

2
太棒了,它可以解决其他情况,即简单的绑定重定向也会由于API的更改而中断工作!
Rhys Bevilaqua 2014年

5
@guidupy您可以引用代码使用的log4net,但是在属性中关闭copyLocal。
杰夫·马丁

4
对于将来的读者(我从另一个答案中找到了一个提示,但请谨慎在此处发布)...对于Web应用程序(asp.net),该引用进行了调整:<codeBase version =“ 1.0.0.0” href =“ bin \ folder \ namedll.dll“ />
granadaCoder

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运行时跳过对所列程序集的验证。从理论上讲,这是一个安全问题,但是由于私钥无论如何都是公开的,因此几乎没有影响。


如您所说,这是一个安全问题。同样,这意味着您必须在运行该软件的每个工作站上进行这些更改。在复杂的企业网络中,这类事情加在一起会造成极大的混乱。我宁愿尽可能避免它。其他解决方案是独立的且可移植的。
Joel Gauvreau

正如我所说,由于私钥无论如何都是公开可用的,因此根本没有真正的安全问题。特别是在企业网络中,配置单个组策略对象要比为每个正在使用的LOB应用程序配置它更容易。您可以在域级别配置一次,而无需再考虑它。
Joep Beusenberg '16

3

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


3
那行得通,但是必须构建一个特殊版本的nhibernate才能更难地支持生产线……谢谢。
Joel Gauvreau,2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.