Answers:
此警告意味着两个项目引用相同的程序集(例如System.Windows.Forms
),但是两个项目需要不同的版本。您有几种选择:
重新编译所有项目以使用相同的版本(例如,将其全部移至.Net 3.5)。这是首选选项,因为所有代码都以编译时所依赖的版本运行。
添加绑定重定向。这样可以消除警告。但是,您的.Net 2.0项目将(在运行时)绑定到相关程序集的.Net 3.5版本,例如System.Windows.Forms
。您可以通过双击Visual Studio中的错误来快速添加绑定重定向。
使用CopyLocal=true
。我不确定这是否会抑制警告。与上面的选项2一样,它意味着所有项目都将使用System.Windows.Forms的.Net 3.5版本。
以下是识别违规引用的几种方法:
我想发布他们在上面的评论中提供的pauloya解决方案。我相信这是找到违规参考的最佳解决方案。
查找“违规参考”的最简单方法是设置“生成”输出详细程度(“工具”,“选项”,“项目和解决方案”,“生成和运行”,“ MSBuild”项目生成“输出详细程度”,“详细”),并在生成之后搜索输出窗口警告。看到上面的文字。
例如,当您在输出面板中搜索“冲突”时,您可能会发现以下内容:
3> There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3> "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.
如您所见,EF版本5和6之间存在冲突。
update-package [your package name] -version 6.0.0 -reinstall
此处我的答案类似的命令来做到这一点stackoverflow.com/questions/22685530/…–
我的一个项目也遇到了同样的问题,但是以上都不是解决警告的方法。我检查了详细的构建日志文件,使用AsmSpy验证了受影响的解决方案中每个项目的正确版本,再次检查了每个项目文件中的实际条目-没有任何帮助。
最终,事实证明问题出在我在一个项目中拥有的一个引用的嵌套依赖关系。反过来,此引用(A)需要(B)的其他版本,而该版本直接从我的解决方案中的所有其他项目中引用。在引用的项目中更新引用可以解决该问题。
Solution A
+--Project A
+--Reference A (version 1.1.0.0)
+--Reference B
+--Project B
+--Reference A (version 1.1.0.0)
+--Reference B
+--Reference C
+--Project C
+--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)
Solution B
+--Project A
+--Reference A (version 1.1.1.0)
我希望以上内容能说明我的意思,花了我几个小时才找到答案,所以希望其他人也能从中受益。
在Visual Studio上,如果右键单击解决方案并管理nuget软件包,则将出现一个“合并”选项卡,该选项卡将所有软件包设置为相同版本。
我遇到了同样的问题,并通过更改web.config中的以下内容来解决。
这件事发生在我身上,因为我正在使用Newtonsoft.Json 4.0运行该应用程序
从:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
至:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
如果您使用Nuget来管理依赖项,我还有另一种方法。我发现有时VS和Nuget不匹配,并且Nuget无法识别您的项目不同步。packages.config会说一件事,但是“参考-属性”中显示的路径会指出其他内容。
如果您愿意更新依赖关系,请执行以下操作:
在解决方案资源管理器中,右键单击项目,然后单击“管理Nuget程序包”
选择左窗格中的'已安装软件包'选项卡记录已安装的软件包如果您有很多的话,可能需要先将您的packages.config复制到桌面上,因此可以与Google进行交叉检查以查看已安装了哪些Nuget pkgs。
卸载软件包。没关系,我们将立即添加它们。
立即安装所需的软件包。Nuget要做的不仅是为您提供最新版本,而且还会更改您的引用,并为您添加绑定重定向。
对您的所有项目都执行此操作。
在解决方案级别,执行“清理并重建”。
您可能要从较低的项目开始,然后逐步发展到较高的项目,然后逐步进行每个项目的重建。
如果您不想更新依赖项,则可以使用程序包管理器控制台,并使用语法Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]
我只是花了一些时间调试相同的问题。请注意,该问题可能不在不同的项目之间,而是实际上在一个项目中的多个引用之间,这些引用依赖于同一dll /程序集的不同版本。在我的情况下,问题是参考FastMember.dll
版本不匹配,该版本来自单个项目中的两个不同的NuGet软件包。当给我一个项目时,它不会编译,因为缺少NuGet软件包,而VS拒绝还原丢失的软件包。通过NuGet菜单,我将所有NuGets手动更新为最新版本,即出现警告时。
在Visual Studio 中,在窗口中Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.
查找行。以下是我得到的输出的一部分:There was a conflict between
Output
1> There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1> "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1> References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1> C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1> Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1> FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1> References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1> C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1> Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1> ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
注意, Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"
ClosedXML.dll
来自ClosedXML
NuGet,取决于FastMember.dll 1.3.0.0
。最重要的是FastMember
,该项目中还包含Nuget,并且具有 FastMember.dll 1.5.0.0
。不匹配!
我已卸载ClosedXML
&FastMember
NuGets,因为我具有绑定重定向并仅安装了最新版本的ClosedXML
那已解决了该问题!
这也发生在我身上。一个dll被两次引用:一次直接(在引用中)和一次间接(由另一个引用的项目引用)。我删除了直接引用,清理和重建的解决方案。问题已解决。
要考虑和检查的另一件事是,请确保您没有正在使用该bin文件夹的任何服务在运行。如果他们停止了服务并重建了解决方案
当我的项目引用NETStandardLibrary并且为netcore发布了一个引用的程序集时,我遇到了这样的问题。刚发布为netstandard,问题就不存在了
这是.NET Core 3.0样式的解决方案:https : //github.com/HTD/ref-check
当您发现什么冲突时,也许您将能够解决这些冲突。如果有冲突的引用来自其他软件包,那么您要么不走运,要么需要使用源。
就我而言,冲突的软件包通常是我自己的,因此我可以修复依赖性问题并重新发布它们。