在相同的解决scheme中引用2个不同版本的log4net

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

所以我可以让NHibernate的工作,如果我引用log4net 1.2.10.0,但简单的SDK不起作用。 反之亦然

我猜大部分的问题来自于log4net已经改变了它的组装密钥。 我尝试使用绑定redirect而没有成功:2个DLL不具有相同的密钥。

我正在考虑重新编译NHibernate使用log4net 1.2.9.0,但这似乎是错误的事情,我的感觉是,简单会计不会更新他们的SDK使用log4net 1.2.10.0不久。

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

我通过使用这个答案find了一个类似的问题的解决scheme

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

然后,通过添加如下内容来修改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]来获得程序集的公钥标记

您可以添加到registry的排除。 只需添加这些键:

 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运行时跳过列出的程序集的validation。 理论上这是一个安全问题,但是由于私钥已经公开,所以几乎没有任何影响。

如果绑定redirect不起作用,而简单的会计SDK是封闭的源,一个可能的解决scheme是重新编译NHibernate使用log4net 1.2.9.0。