2012-03-22 213 views
32

最近添加log4net.dll到我们的数据对象。我们的数据对象完全建立,但是当你试图建立任何引用我们的数据对象,您会收到以下错误:如何解决“无法解决之间的冲突”错误?

No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily.

我发现下面thread这使我能够获得有关该问题的更多信息。

log4net用于我们项目中的各种事情。例如,Crystal将1.2.9安装到GAC中。我知道infragictics使用1.2.10。

我们有一个特定的目录 - 叫做c:\references - 我们建立了所有的dll,并且所有的应用程序都使用它来引用我们的内部dll。因此,我特别将我的数据对象中的引用设置为版本1.2.11的c:\ references \ log4net.dll。这很奇怪,因为在上面的错误消息中你没有看到1.2.11。该DLL被引用特定版本:=真&复制本地:=真。我检查了构建目录& 1.2.11的log4net确实移动正确。

如果它帮助这里有一些详细的错误信息:

There was a conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". 
    No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily. 
     References which depend on "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" [C:\Windows\assembly\GAC_32\log4net\1.2.10.0__692fbea5521e1304\log4net.dll]. 
      C:\Windows\assembly\GAC_MSIL\CrystalDecisions.Shared\13.0.2000.0__692fbea5521e1304\CrystalDecisions.Shared.dll 

    References which depend on "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905" [C:\Program Files (x86)\Business Objects\Common\4.0\managed\log4net.dll].   c:\references\DBObjectAdoNet.dll 
      Project file item includes which caused reference "c:\references\DBObjectAdoNet.dll". 

更新:到目前为止,我发现修复错误的唯一方法是在任何引用DBObjectAdoNet.dll参考log4net的。这对我们来说不是一个真正可用的解决方案,因为我们整个系统中的几乎所有内容都使用它。

第二次更新:试图将log4net放入GAC认为可以解决问题但仍然无法解决的问题。

第3次更新:我已经致电微软。他们希望我使用Assembly.LoadFrom(),因为我们在一个应用程序中创建了超过300,000个调用,并且需要为每个调用进行反射,这会让事情减慢很多,所以我非常非常犹豫。

我发现如果我卸载我的机器上的晶体运行时错误消失了,这并没有什么意义,因为它唯一能做的就是从目录中删除log4net 1.2.10.0 GAC在.NET framework 2.0文件夹下,这应该不重要,因为该应用程序是.NET Framework 4应用程序。

+0

'报价'我发现如果我卸载我的机器上的晶体运行时'/ quote' - 问题:**晶体运行时**?什么**晶体运行时**? – 2012-07-05 13:32:47

+0

@Robert Crystal 11 x86 for .Net Framework 4.我认为当我遇到问题时,x64版本也会发生同样的情况。 – coding4fun 2012-09-28 15:58:28

+0

我在无法解决冲突的项目中添加了我想要的log4net版本的引用,并解决了此问题。 – 2016-01-22 14:41:39

回答

2

我们发现晶振运行时肯定是问题所在。如果我们卸载log4net %windir%\assembly安装了Crystal运行时,则警告消息将消失。奇怪的是,如果我从log4net的站点安装log4net 1.2.10到GAC,那么警告消息不会再出现。如果任何人都可以解释,那么请添加到此线程。 Crystal使用自己的强名称密钥(公钥标记不同)对log4net进行签名。

解决log4net问题的关键是log4net是一个开源项目。这意味着我们可以简单地使用不同的名称从源代码构建dll。还没有尝试过,但应该解决这个问题。每当我们想更新log4net时,我们都会有额外的源代码构建步骤,但考虑到我们要更新dll的次数,这不是什么大问题。

+6

我们尝试了这种方法,结果令人沮丧。 CLR很高兴地加载了这两个程序集,但无法解决两者都存在的ILog。结果,我们失去了一半的伐木量。 – 2012-10-24 22:40:44

+0

@BrendaBell对不起,它没有为你工作。它的工作,但当然每个人的配置将会有所不同 – coding4fun 2014-04-10 17:53:07

14

打开项目文件(C#中的.csproj或VB.NET中的.vbproj)进行编辑。

确保log4net参考是Fully Qualified Type Name,有HintPathSpecificVersion=True

<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> 
    <HintPath>..\references\log4net.dll</HintPath> 
    <SpecificVersion>True</SpecificVersion> 
</Reference> 

保存该文件并尝试重建。

+1

感谢您的回复。试了一下遗憾的是它没有工作: <参考包括= “log4net的,版本= 1.2.11.0,文化=中性公钥= 669e0ddf0bb1aa2a,ProcessorArchitecture用于= MSIL”> C:\引用log4net.dll \ coding4fun 2012-03-23 12:32:02

+0

尝试相反的路径,不提供特定的版本: '<参考包含= “log4net的”> ' – KMoraz 2012-03-23 16:20:26

+1

都能跟得上即没有按” t工作要么 – coding4fun 2012-03-29 13:37:16