asp.net “系统.值元组...”和“mscorlib ...”中都存在“值元组〈T1,T2>”

0qx6xfy6  于 2023-02-14  发布在  .NET
关注(0)|答案(2)|浏览(234)

B "H
我正在尝试使用C#7的新元组特性,但是遇到了一点问题。实际上,它们工作得很好,我不确定是什么改变了它们。
我正在使用ASP.Net 4MVC 5,目标是.net framework 4.6.1
所以为了使用元组,我必须使用Nuget包'System.ValueTuple'。没有它,项目将无法编译。它运行了一段时间。然后今天当我加载任何使用元组的页面时,我得到
编译器错误消息:CS0433:类型"ValueTuple"同时存在于"System. ValueTuple,版本= 4.0.2.0,区域性=中性,公钥标记= cc7b13ffcd2ddd51"和"mscorlib,版本= 4.0.0.0,区域性=中性,公钥标记= b77a5c561934e089"中
这个项目编译得很好,如果我删除System.ValueTuple,它就不能编译了,但是当我在一个网页上运行它时,我得到了这个错误。
我在谷歌上的搜索显示ValueTuple被添加到.net 4.7中,但我在项目中的任何地方都没有提到4.7,我也没有针对4.7进行编译。
谢谢

93ze6v8z

93ze6v8z1#

ASP.NET网页是在运行时编译的,并且此编译忽略VS使用的引用程序集。如果.NET 4.7在运行时可用,则将拾取所有.NET 4.7的类型,包括其ValueTuple的定义,沿着您可能从其他DLL获得的任何其他定义。
如果您已经安装了.NET 4.7,避免这个问题的最简单方法是在您的开发环境中也使用.NET 4.7,或者避免运行时编译。
对于前者,你需要安装.NET 4.7目标包。它应该是Visual Studio安装程序中的一个选项。当你这样做时,你可以避免ValueTuple NuGet包,从而避免冲突。
对于后者,您可以在发布Web项目时打开 precompilation。当您这样做时,所有通常在运行时发生的编译都将在发布过程中发生,以一种可控的方式,在这种情况下不会看到.NET 4.7的附加内容。

o4tp2gmn

o4tp2gmn2#

我在面向. NET 4.7.2的WPF应用程序中遇到了这个问题。我的测试项目使用Specflow,它的依赖项之一是System.ValueTuple,所以我无法卸载它。因此,我所做的是删除项目的app.config文件中对nuget包的引用。
删除:

<dependentAssembly>
     <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
     <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>

相关问题