最近将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”。
我发现以下thread使我能够获得有关此问题的更多信息。
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&复制本地:=真。我检查了构建目录& 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".
更新:到目前为止,我发现修复错误的唯一方法是在引用DBObjectAdoNet.dll的任何内容中引用log4net。这几乎不是我们真正可用的解决方案 我们整个系统中的一切都使用它。
第二次更新:尝试将log4net放入GAC,以便解决问题,但仍然没有。
第三次更新:我已向微软发起了支持电话。他们希望我使用Assembly.LoadFrom(),我非常非常犹豫,因为我们在一个应用程序中进行了超过300,000次调用,并且需要针对每次调用进行反射,这会使事情变得相当缓慢。
我发现如果我在我的机器上卸载了水晶运行时错误消失了,这没有多大意义,因为据我所知,它唯一能做的就是删除log4net 1.2.10.0 .NET Framework 2.0文件夹下的GAC,这应该不重要,因为该应用程序是一个.NET framework 4应用程序。
答案 0 :(得分:16)
打开您的项目文件(C#中的.csproj
或VB.NET中的.vbproj
)进行编辑。
确保log4net引用为Fully Qualified Type Name,HintPath
和SpecificVersion=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 :(得分:2)
我们发现水晶运行时肯定是问题所在。如果我们在安装了水晶运行时的%windir%\assembly
处卸载了log4net,那么警告消息就会消失。奇怪的是,如果我将log4net 1.2.10从log4net的站点安装到GAC中,那么警告消息就不会重新出现。如果有人可以解释那么请添加到这个主题。 Crystal使用自己的强名称密钥对log4net进行了签名(公钥令牌不同)。
修复log4net问题的关键是log4net是一个开源项目。这意味着我们可以使用不同的名称简单地从源构建dll。尚未尝试过,但这应该解决问题。我们每次想要更新log4net时都会从源代码构建额外的步骤,但考虑到我们要更新dll的程度,这不是什么大问题。
答案 2 :(得分:1)
您有两个不同的程序集,它们具有相同的文件名。编译器不知道要选择哪个复制到输出目录,因此会出现No way to resolve conflict between...
错误。
就我而言,它们是完全个具有相同文件名的不同程序集。
在您的情况下,同一程序集(log4net)有两个不同的版本
就我而言,解决方案是简单地重命名一个dll文件。
在您的情况下,解决方案是找出较旧的程序集在哪里,并更正它以引用较新的程序集。
答案 3 :(得分:1)
在运行引用netstandard2_0库的net Framework v4.6.2应用程序时,您也会收到此消息。 Net462不完全支持netstandard,因此很多dll被复制为不同版本。即使您未引用某些内容(例如System.Drawing),也可能会看到冲突。考虑升级到更高的网络框架版本(我刚刚更改为4.7.2,已解决了该问题)。