我目前正在开发一个。net应用程序,它由20个项目组成。其中一些项目是使用。net 3.5编译的,其他一些仍然是。net 2.0项目(到目前为止没有问题)。
问题是,如果我包含一个外部组件,我总是得到以下警告:
发现同一依赖程序集的不同版本之间存在冲突。
这个警告到底是什么意思,有没有可能排除这个警告(比如在源代码文件中使用#pragma disable)?
我目前正在开发一个。net应用程序,它由20个项目组成。其中一些项目是使用。net 3.5编译的,其他一些仍然是。net 2.0项目(到目前为止没有问题)。
问题是,如果我包含一个外部组件,我总是得到以下警告:
发现同一依赖程序集的不同版本之间存在冲突。
这个警告到底是什么意思,有没有可能排除这个警告(比如在源代码文件中使用#pragma disable)?
基本上,当您引用的程序集将“Copy Local”设置为“True”时,就会发生这种情况,这意味着DLL的副本与exe一起放置在bin文件夹中。
由于Visual Studio也会复制所引用程序集的所有依赖项,因此最终可能会引用同一个程序集的两个不同构建。如果您的项目在不同的解决方案中,因此可以单独编译,则更有可能发生这种情况。
我解决这个问题的方法是在组装项目中将Copy Local设置为False。只针对可执行文件/web应用程序,在这些应用程序中,您需要运行成品的程序集。
希望这有意义!
这实际上取决于外部组件。当你在. net应用程序中引用一个外部组件时,它会生成一个GUID来标识该组件。当某个项目引用的外部组件与另一个程序集中的另一个此类组件名称相同但版本不同时,会发生此错误。
当您使用“浏览”查找引用并添加错误版本的程序集时,有时会发生这种情况,或者您的代码存储库中组件的版本与您在本地机器中安装的版本不同。
尝试找出哪些项目有这些冲突,从引用列表中删除组件,然后再次添加它们,确保指向相同的文件。
此警告意味着两个项目引用相同的程序集(例如System.Windows.Forms),但这两个项目需要不同的版本。你有几个选择:
Recompile all projects to use the same versions (e.g. move all to .Net 3.5). This is the preferred option because all code is running with the versions of dependencies they were compiled with. Add a binding redirect. This will suppress the warning. However, your .Net 2.0 projects will (at runtime) be bound to the .Net 3.5 versions of dependent assemblies such as System.Windows.Forms. You can quickly add a binding redirect by double-clicking on error in Visual Studio. Use CopyLocal=true. I'm not sure if this will suppress the warning. It will, like option 2 above, mean that all projects will use the .Net 3.5 version of System.Windows.Forms.
这里有几个方法来识别不合适的推荐人:
您可以使用一个实用程序,例如在 https://gist.github.com/1553265 另一个简单的方法是设置Build 输出冗长(工具,选项,项目和解决方案,构建和 运行,MSBuild项目构建输出详细,详细)之后 构建时,在输出窗口中搜索警告,并查看 文字就在上面。(向保罗亚致敬,她在 对这个答案的评论)。
我在我的一个项目中也遇到了同样的问题,然而,上面没有一个有助于解决警告。我检查了详细的构建日志文件,我使用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)
我希望上面的说明说明了我的意思,我花了几个小时才发现,所以希望其他人也能从中受益。
如果你使用Nuget来管理依赖项,我还有另一种方法。我发现有时候VS和Nuget不匹配,Nuget无法识别你的项目不同步。的包。config会说一件事,但在References - Properties中显示的路径将指示其他内容。
如果你愿意更新你的依赖项,请执行以下操作:
From Solution Explorer, right click the Project and click 'Manage Nuget Packages' Select 'Installed packages' tab in left pane Record your installed packages You may want to copy your packages.config to your desktop first if you have a lot, so you can cross check it with Google to see what Nuget pkgs are installed Uninstall your packages. Its OK, we're going to add them right back. Immediately install the packages you need. What Nuget will do is not only get you the latest version, but will alter your references, and also add the binding redirects for you. Do this for all of your projects. At the solution level, do a Clean and Rebuild.
您可能希望从较低的项目开始,然后逐步到较高级别的项目,并在进行过程中重新构建每个项目。
如果你不想更新你的依赖项,那么你可以使用包管理器控制台,并使用语法update - package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]
打开“解决方案资源管理器”。 点击“显示所有文件” 扩大“引用” 您将看到一个(或多个)引用与其他引用的图标略有不同。通常情况下,它会有一个黄色的方框,建议你记下它。把它拿掉。 重新添加引用并编译代码。 这是所有。
在我的例子中,MySQL引用有一个问题。不管怎样,我可以在所有可用的引用列表下列出它的三个版本;适用于。net 2.0、。net 4.0和。net 4.5。我遵循了上面的方法1到6,它对我很有效。
我也有同样的问题,我通过在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>
To:
<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>
我想在上面的评论中发布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之间存在冲突。
=>检查将有一些实例的应用程序部分安装。
=>首先从卸载应用程序卸载该实例。
=>然后,清理,重建,并尝试部署。
这解决了我的问题。希望它也能帮助到你。 致以最亲切的问候。
在Mac Visual Studio上编辑.resx文件时似乎有一个问题。 我真的不知道发生了什么,但当我在Mac上编辑一些.resx文件时,我就遇到了这个问题。 我在Windows上打开项目,打开文件,它们就像没有被编辑过一样。 于是我编辑了它们,保存了下来,Mac上的一切也都恢复正常了。
如果使用NuGet,我所要做的是:
右键单击项目,单击管理NuGet包.. 点击右上角的齿轮 在包源上方的NuGet包管理器中单击“常规”选项卡 检查“跳过应用绑定重定向”在绑定重定向 清理重建,警告就没了
容易peasy
I just spent sometime debugging the same issue. Note, that issue might not be between different projects, but actually between several references in one project that depend on different versions of the same dll/assembly. In my case, issue was reference FastMember.dll versions mismatch that comes from two different NuGet packages in a single project. When I was given a project, it would not compile because NuGet packages were missing and VS refused to restore missing packages. Through the NuGet menu, I manually update all the NuGets to the latest version, that is when the warning appeared.
在Visual Studio工具中>选项>构建和运行> msbuild项目构建输出详细信息:(设置为)诊断。在“输出”窗口中查找有冲突的行。下面是我得到的输出部分:
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)
注意,该项目文件项包括导致引用“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的最新版本,解决了这个问题!
下面是解决方案,.NET Core 3.0风格: https://github.com/HTD/ref-check
当你发现哪些冲突时,也许你就能解决这些冲突。 如果冲突的引用来自其他包,那么您要么不走运,要么需要使用源。
在我的例子中,冲突的包通常是我自己的,所以我可以修复依赖关系问题并重新发布它们。
我也有同样的问题。在项目的“obj”文件夹中,我将文件夹“Debug”重命名为“Debug_OLD”并重新构建。一个新的“Debug”文件夹会自动生成,问题也就解决了。
在花了几个小时分析详细的构建日志之后,我发现我的解决方案中的几个项目针对的是不同的. net版本。我将它们全部更改为. net 4.7.2并重新构建解决方案,错误得到解决。