我正在开发一款.NET应用程序,由20个项目组成。其中一些项目使用.NET 3.5进行编译,其他一些项目仍是.NET 2.0项目(目前没有问题)。
问题在于,如果我包含一个外部组件,我总是会收到以下警告:
发现同一依赖程序集的不同版本之间存在冲突。
这个警告具体是什么意思?是否有可能排除这个警告(例如在源代码文件中使用 #pragma disable)?
这个警告意味着两个项目引用了同一个程序集(例如System.Windows.Forms
),但是两个项目需要不同的版本。您有几个选项:
重新编译所有项目以使用相同的版本(例如将所有内容移动到 .Net 3.5)。这是首选的选项,因为所有代码都是使用它们编译时依赖项的版本运行。
添加绑定重定向。这将抑制警告。但是,您的 .Net 2.0 项目将在运行时绑定到诸如 System.Windows.Forms
的 .Net 3.5 版本的相关程序集。您可以通过在 Visual Studio 中双击错误来快速添加绑定重定向。
使用CopyLocal=true
。我不确定这是否会抑制警告。就像上面第二种方法一样,这意味着所有项目将使用 .Net 3.5 版本的 System.Windows.Forms。
以下是几种查找问题引用的方法:
基本上,当你引用的程序集的“Copy Local”设置为“True”时,就会发生这种情况,这意味着DLL的副本将与你的exe一起放置在bin文件夹中。
由于Visual Studio也会复制被引用程序集的所有依赖项,因此可能会出现引用同一个程序集的两个不同版本的构建。如果你的项目在不同的解决方案中,那么这种情况更有可能发生,因为它们可以分别编译。
我解决这个问题的方法是,在程序集项目中将“Copy Local”设置为False。只对你需要程序集来运行最终产品的可执行文件/ Web应用程序进行设置。
希望这有意义!
我想发布 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
的命令来执行此操作,如我在这里的答案中所述https://dev59.com/o-o6XIcBkEYKwwoYJA7p#26891914。 - user1477388在 Visual Studio 上,如果您右键单击解决方案并选择管理 NuGet 包,则会出现一个"整理"选项卡,该选项卡可以将所有包设置为相同的版本。
我在我的一个项目中遇到了同样的问题,但是以上方法都没有帮助解决警告。我检查了详细的构建日志文件,使用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)
希望上面的内容展示了我的意思,我花了几个小时才找到答案,希望其他人也能从中受益。
我刚刚收到了这个警告信息,然后清理了解决方案并重新编译(Build -> Clean Solution),然后它就消失了。
我曾经遇到过同样的问题,在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>
FastMember.dll
版本不匹配。当我得到一个项目时,由于缺少NuGet包,它无法编译,VS拒绝恢复缺少的包。通过NuGet菜单,我手动更新所有NuGets到最新版本,这时出现了警告。工具 > 选项 > 生成和运行 > MSBuld项目生成输出详细程度:(设置为)诊断。
在输出
窗口中查找There was a conflict between
行。以下是我得到的输出部分: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)
ClosedXML.dll
来自 ClosedXML
NuGet,并依赖于 FastMember.dll 1.3.0.0
。此外,项目中还有 FastMember
Nuget,它有 FastMember.dll 1.5.0.0
。版本不匹配!ClosedXML
和 FastMember
NuGets,并安装了最新版本的 ClosedXML
。这解决了问题!