如何修复"无法解决之间的冲突"错误?

cod*_*fun 39 .net msbuild log4net

最近将log4net.dll添加到我们的数据对象.我们的数据对象构建完美,但是当您尝试构建引用我们的数据对象的任何内容时,您会收到以下错误:

无法解决"log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304"和"log4net,Version = 1.2.9.0,Culture = neutral,PublicKeyToken = b32731d11ce58905"之间的冲突.任意选择"log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304".

我发现以下线程使我能够获得有关该问题的更多信息.

log4net用于我们项目中的各种事情.例如,晶体在GAC中安装了1.2.9.我知道infragictics使用1.2.10.

我们有一个特定的目录 - 调用它c:\references- 我们构建所有的dll,并且我们所有的应用程序都用来引用我们的内部dll.所以我特意在数据对象中将我的引用设置为c:\ references\log4net.dll,即版本1.2.11.这很奇怪,因为在上面的错误消息中你没有看到1.2.11.dll以特定版本引用:= True&Copy Local:= True.我检查了构建目录和log4net的1.2.11确实被正确移动了.

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

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".
Run Code Online (Sandbox Code Playgroud)

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

第二次更新:尝试将log4net放入GAC思考,以解决问题,但仍然没有.

第三次更新:我已经向微软发起了支持电话.他们要我用Assembly.LoadFrom(),我感到非常,非常犹豫做到,因为我们做一个应用程序超过30万电话和需要为每次调用这会慢下来不少反映.

我发现如果我在我的机器上卸载了水晶运行时,错误消失了,这没有多大意义,因为据我所知,它唯一能做的就是从GAC下删除log4net 1.2.10.0 .NET framework 2.0文件夹,这应该无关紧要,因为该应用程序是一个.NET framework 4应用程序.

KMo*_*raz 16

打开项目文件(.csproj在C#或.vbprojVB.NET中)进行编辑.

确保log4net引用是完全限定类型名称,具有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> 
Run Code Online (Sandbox Code Playgroud)

保存文件并尝试重建.


cod*_*fun 2

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

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

  • 我们尝试过这种方法,但结果却是灾难性的。CLR 很乐意加载这两个程序集,但无法解析两者中都存在的 ILog。结果,我们损失了一半的伐木量。 (6认同)