dotnet恢复警告NU1701


69

我在C#中使用.NET Core,当我这样做时dotnet restore,它出现以下错误:

PS C:\ workspace \ Arbitrator> dotnet恢复

C:\ workspace \ Arbitrator \ Arbitrator.csproj:警告NU1701:使用'.NETFramework,Version = v4.6.1'代替了项目目标框架'.NETCoreApp,Version = v2.0'恢复了软件包'PusherClient 0.5.0'。这可能会导致兼容性问题。C:\ workspace \ Arbitrator \ Arbitrator.csproj:警告NU1701:使用'.NETFramework,Version = v4.6.1'代替了项目目标框架'.NETCoreApp,Version = v2.0'恢复了软件包'WebSocket4Net 0.14.1'。这可能会导致兼容性问题。

这个有问题的软件包是PusherClient。我只是按照NuGet文档进行导入。如何解决此警告?

Answers:


91

您不必等到PusherClient升级为.NET Core。

自.NET Core / Standard 2.0预览版2 / VS 2017预览版15.3起,从.NET Core引用.NET Framework 4.6.1(及以下版本)是一项新功能,根据MS的说法,它可以被认为是有助于随着时间的推移,您将.NET Framework代码迁移到.NET Standard或.NET Core

  1. 您可以禁止显示此警告

    • 对于特定的包装
     <PackageReference Include="Contoso.Base.API" Version="1.0.3">
         <NoWarn>NU1701</NoWarn>
     </PackageReference>
    
    • 对于所有包裹
     <NoWarn>NU1701</NoWarn>
    

    有关从GUI执行此操作的方法,请参见NuGet Wiki中的方案2和3

    但是,当您调用.NET Core不支持的API(例如WPF中的某些内容)时,您的应用程序可能会在运行时失败。失败的另一个原因可能是PusherClient可能使用的本机API 。因此,您应该对其进行广泛的测试。但是在大多数情况下,它只能在支持.NET Core的所有平台上运行(例如,我已经测试了具有MathNet.Numerics依赖性的应用程序, 即使MathNet.Numerics也是.NET Framework 4.6.1 ,它也可以在Linux上运行。 )。

  2. 如果您不需要跨平台的应用程序,只需将以下内容添加到csproj文件中,即可将其目标框架更改为.NET 4.6.1:

     <TargetFramework>net461</TargetFramework>
    

1
是否可以抑制这种警告?
mateuszlewko

9
是的,将<PropertyGroup> <NoWarn> NU1701 </ NoWarn> </ PropertyGroup>放入您的csproj
Lars Truijens

PackageReference.csproj文件中看不到抑制警告的方法。我确实在这个主题上发现了一个未解决的问题:github.com/NuGet/Home/issues/5740。投票:)
yair

27

附带说明,不要这样做:

<PropertyGroup>
  <NoWarn>NU1701</NoWarn>
</PropertyGroup>

这样做将破坏其他地方(例如,从directory.build.prop文件中)获取的任何其他NoWarn设置。相反,请执行以下操作:

<PropertyGroup>
  <NoWarn>$(NoWarn);NU1701</NoWarn>
</PropertyGroup>

这样,将保留所有全局设置。


<PackageReference>虽然可以,但不是吗?

这真的取决于。我的解决方案相当大,它大量使用Directory.Build.Props文件在所有项目中设置通用设置。这些设置之一是要警告的警告列表。在这种情况下,不带$(NoWarn)这个项目将覆盖该列表,并且只有单个NU1707压缩。
克里斯M.19年

8

对于.NET Core 1.x:

您需要告诉PusherClient的家伙准备好他们的.NET-Core项目。


是什么使库没有.NET-Core就绪?它已经在nuget.org中,所以我认为可以使用它吗?
fluter

1
@fluter PusherClient是一个.Net Framework库。要在.Net Core 1.x上使用它,需要将其更改为.Net Standard 1.x库。
1998年

1
@fluter但是,根据MS的说法,它是.NET Core 2.0版的新功能,您可以引用.NET Framework 4.6.1(及以下)库。
Sourcerer '17

2

正如Yair指出的那样,在GitHub上有一个关于此主题的未解决问题:github.com/NuGet/Home/issues/5740

如果使用后备框架版本解决的依赖关系是可传递的,则抑制引用包的警告将不起作用。

例如,Microsoft.TeamFoundationServer.ExtendedClient依赖于与.NET Core 3.0不兼容的Microsoft.AspNet.WebApi.Core。无法将NoWarn添加到Microsoft.TeamFoundationServer.ExtendedClient。

作为一种解决方法(您可以在此处查看我的文章:GitHub问题上的解决方法),您可以直接引用传递依赖项,并对该包使用NoWarn。

<ItemGroup>
    <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.3" NoWarn="NU1701" />
    <PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="16.153.0"/>
</ItemGroup>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.