我正在使用引用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。
处理此问题的最佳方法是什么?是否有可能解决?
答案 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。