如何阻止Nhibernate log4net与现有的log4net冲突?

时间:2012-02-16 11:40:53

标签: nhibernate log4net

我对此非常陌生,所以如果我的问题结构不合理,或者只是在错误的地方,我道歉,等等。我已经很好地寻找解决方案并尝试了许多不同的方法但是避风港找不到任何有效的东西......

我有一个使用Nhibernate的解决方案,因此必须使用log4net / 2.0 /文件夹中的log4net V1.2.10.0。然而,我的解决方案还链接到许多其他解决方案,我访问的解决方案非常有限。这些使用相同的log4net V.1.2.10.0但在文件夹:log4net / 1.2 /

当我运行我的解决方案时,我收到此错误。

{"Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from HRESULT: 
0x80131040)":"log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d"}

我试图修改它正在调用的解决方案,但每次我修改一个时,我会在尝试使用另一个解决方案时在该解决方案中得到错误,所以我必须修改另一个等等。有太多的解决方案需要修改,而且与其他解决方案有太多的相互依赖性,我完全无法控制它以便能够将它们全部更改为使用log4net / 2.0。

我发现了另一个问题(Referencing 2 different versions of log4net in the same solution),我认为它基本上是同一个问题,他们用绑定修改了app.config,但是我似乎无法做到这一点,因为我是仍然得到同样的错误。我在app.config中包含的绑定是这样的:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="e27b8fa57f63a98d" />
    <codeBase version="1.2.10.0" href="2.0\log4net.dll" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821"/>
    <codeBase version="1.2.10.0" href="1.2\log4net.dll" />
  </dependentAssembly>
 </assemblyBinding>
</runtime>

我不确定另一个问题的答案是什么意思,当它说“你在项目中为每个版本的log4net创建一个文件夹。你通过添加一个文件将每个log4net.dll放在相应的文件夹中解决方案(不带添加引用)。您可以将复制到输出目录属性设置为始终复制,以便在构建时自动将其复制到输出文件夹。“我是否需要对我的解决方案引用的每个解决方案执行此操作?

理想情况下,我希望能够对我的解决方案进行修改,这意味着它不关心任何解决方案正在使用的log4net,但它们仍然可以在彼此之间传递日志消息。我认为这是可能的,所以任何帮助都将非常感激。无论是那个或如何关闭nHibernate的记录器,以便它不关心我正在使用的log4net,所以我可以继续使用所有其他解决方案正在使用的log4net / 1.2。我已经尝试了各种各样的事情来关闭它但它似乎仍然试图找到log4net / 2.0。

1 个答案:

答案 0 :(得分:1)

您很幸运,因为您在两个不同的地方拥有相同的DLL,这使您的问题更容易解决。您可以简单地进行备份,然后删除DLL的一个引用(\ 1.2 \ version?),然后解决解决方案中任何损坏的引用 - 这应该让您可以编译。

你也试过NuGet吗?您可以添加对Log4Net的引用,然后添加对Nhibernate的引用,这将看到您已经满足它的依赖性要求,并且不需要下载对NHibernate的另一个引用。

我建议使用NuGet的学习曲线,因为它是一个强大的工具,从长远来看,它可以让你的生活更轻松。

<强>更新 请参阅我关于提供当前文件夹结构的评论以帮助您 - 您可以这样做;以下内容应该让你开始。

要尝试使用直接文件引用来执行此操作,您可能需要将DLL移动到更好的结构中。在解决方案(而不是项目)中,在解决方案项下创建以下文件夹结构。

\ EXTERNALREFERENCES     \ log4net的\     \ NHibernate的\

将log4net DLL的单个副本移动到log 4 net文件夹中(并删除另一个实例),然后将所有正在使用的NHibernate DLL(减去Log4Net)移动到NHibernate目录中。删除app.config中的绑定,然后浏览每个项目,更新引用以指向外部引用中的版本。

文件的实际位置并不重要,您只需要您的代码来引用DLL的单个实例,然后在构建它们时,它们都会被复制到bind文件夹中。你只是遇到了问题,因为你有两个实例 - 当你正在编辑你的代码时,NHibernate实际上并没有太多困扰Log4Net;它只是依赖它,它必须在运行时填充。

更新2

新版本的Log4Net在NuGet上破坏了向后兼容性 - 有关详细信息,请参阅引用的博客文章。现在有一个1.24.0版本的Log4Net,其中包含一个与1.2.10.0不同的强名称,这让事情变得更难了!