还原警告 NU1701

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

工作区仲裁员 > 网络恢复

C: 工作空间仲裁员。 csproj: 警告 NU1701: 使用’恢复包‘ PusherClient 0.5.0’。NETFramework,Version = v4.6.1’而不是项目目标框架’。NETCoreApp,Version = v2.0’。这可能会导致兼容性问题。 C: 工作区仲裁员仲裁员.csproj: 警告 NU1701: 使用’恢复包‘ WebSocket4Net 0.14.1’。NETFramework,Version = v4.6.1’而不是项目目标框架’。NETCoreApp,Version = v2.0’。这可能会导致兼容性问题。

这个问题包是 推送客户端。我只是跟踪 NuGet 文件导入它。我如何修正这个警告?

56207 次浏览

For .NET Core 1.x:

You need to tell the guys from PusherClient to make their project .NET-Core ready.

You don't necessarily have to wait until PusherClient is upgraded for .NET Core.

Referencing .NET Framework 4.6.1 (and below) from .NET Core is a new feature available since .NET Core/Standard 2.0 preview 2 / VS 2017 preview 15.3, and according to MS, it can be thought of as a feature that helps you migrate .NET Framework code to .NET Standard or .NET Core over time.

  1. You can just suppress this warning

    • for a specific package
     <PackageReference Include="Contoso.Base.API" Version="1.0.3">
    <NoWarn>NU1701</NoWarn>
    </PackageReference>
    
    • for all packages
     <NoWarn>NU1701</NoWarn>
    

    See scenarios 2 and 3 in NuGet wiki for ways to do it from GUI.

    It is possible, though, that your application may fail in run-time when you call an API (like something from WPF) that is not supported by .NET Core. Another reason of a failure could be native APIs possibly used by PusherClient. So you should test it extensively. But in most cases, it will just work on all platforms where .NET Core is supported (for example, I have tested an application with MathNet.Numerics dependency and it worked on Linux even though MathNet.Numerics is also .NET Framework 4.6.1).

  2. If you don't need your app to be cross-platform, just change its target framework to .NET 4.6.1 by adding the following to your csproj file:

     <TargetFramework>net461</TargetFramework>
    

As a side note, don't do this:

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

Doing that will break any other NoWarn settings being picked up elsewhere, such as from a directory.build.prop file. Instead, do this:

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

That way, any global settings are preserved.

As Yair pointed out, there is an open issue around this subject on GitHub: github.com/NuGet/Home/issues/5740.

Where the dependency being resolved with a fallback framework version is transitive, suppressing the warning for the referenced package will not work.

For example, Microsoft.TeamFoundationServer.ExtendedClient is dependent on Microsoft.AspNet.WebApi.Core which isn't compatible with .NET Core 3.0, resulting in the warning. Adding NoWarn to Microsoft.TeamFoundationServer.ExtendedClient won't work.

As a workaround (You can see my post here: Workaround On GitHub Issue), you can directly reference the transitive dependency and use NoWarn against that package.

<ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.3" NoWarn="NU1701" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="16.153.0"/>
</ItemGroup>