【问题标题】:How do I stop Nhibernate log4net conflicting with existing log4net?如何停止 Nhibernate log4net 与现有 log4net 冲突?
【发布时间】:2012-02-16 11:40:52
【问题描述】:

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

我有一个使用 Nhibernate 的解决方案,因此必须使用 log4net V1.2.10.0,它位于 log4net/2.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 版本创建 2 个文件夹。您通过将文件添加到解决方案(不添加参考)。您可以将复制到输出目录属性设置为始终复制,以便在构建时自动复制到输出文件夹。我需要对我的解决方案引用的每个解决方案都这样做吗?

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

【问题讨论】:

  • 对不起,我才意识到我没有包含这部分。当我使用上面的绑定时,我会在尝试运行解决方案时立即收到此错误。 {"Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' 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=1b44e1d426115821"} 如果我在尝试引用另一个解决方案之前不使用它运行的绑定,那么我会在顶部收到错误。
  • 您使用的是哪个版本的 NHibernate? NHibernate 自 3.0.0 起不再需要特定版本的 log4net。
  • 别担心,在开始使用 OSS 项目时遇到“DLL 地狱”版本控制问题并不罕见;但值得坚持

标签: nhibernate log4net


【解决方案1】:

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

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

我推荐使用 NuGet 的学习曲线,因为它是一个强大的工具,从长远来看应该会让你的生活更轻松。

更新 请参阅我关于提供您当前的文件夹结构以提供帮助的评论 - 如果您可以这样做;以下内容应该可以帮助您入门。

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

\外部参考 \Log4Net\ \NHibernate\

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

文件的实际位置并不那么重要,您只需要您的代码引用 DLL 的单个实例,然后在构建时将它们全部复制到绑定文件夹中。您只是遇到了问题,因为您有两个实例 - 在您编辑代码等时。NHibernate 实际上并不太在意 Log4Net 所在的位置;它只是对它有一个依赖,必须在它运行时填充。

更新 2

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

【讨论】:

  • 我不太明白你的第一段。我的解决方案中只引用了 2.0“版本”(以便 nHibernate 工作),但在所有其他解决方案中都引用了 1.2“版本”,我无法更改所有这些,因为我没有访问权限对他们所有人。我也要去看看 NuGet,但你能解释一下第一段吗?
  • 我肯定会推荐 NuGet 方法,因为它旨在解决这些问题。但是,要尝试仅使用直接引用来解决问题,请确认您只是在项目中包含 DLL 引用。
猜你喜欢
  • 2023-03-12
  • 2012-03-31
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多