PAYATHON 2026

.NET 10 中如何处理 System.Text.Encoding.CodePages 的 NU1510 警告?

数据小许

结论

如果类库只面向 net10.0,通常可以从项目文件中删除 System.Text.Encoding.CodePages 的 PackageReference,保留 RegisterProvider 注册和读取代码。NU1510 表示 NuGet 认为这个直接包引用可以裁剪,因为目标框架已提供相同或更高版本的程序集。警告不会检查代码是否调用了这个包。微软的 NU1510 说明建议移除这类不必要的直接引用。

处理步骤

先检查类库 .csproj 中的包引用:

<ItemGroup>
  <PackageReference Include="System.Text.Encoding.CodePages" Version="你的版本" />
</ItemGroup>

如果项目只针对 net10.0,删除该引用,然后重新还原和构建。代码中的编码提供程序注册和读取逻辑可以保留:

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

using var reader = new StreamReader(FileName, Encoding.GetEncoding(1252));

如果类库还要支持较旧的目标框架,可以按目标框架添加条件引用。例如,下面的写法只会在 net8.0 时添加包引用。请根据项目实际支持的框架调整版本和条件:

<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
  <PackageReference Include="System.Text.Encoding.CodePages" Version="你的版本" />
</ItemGroup>

多目标项目也可以把条件直接写在 PackageReference 上:

<PropertyGroup>
  <TargetFrameworks>net8.0;net10.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="System.Text.Encoding.CodePages"
                    Version="你的版本"
                    Condition="'$(TargetFramework)' == 'net8.0'" />
</ItemGroup>

.NET 10 SDK 默认会对适用的项目启用包裁剪。如果包只在部分目标框架上需要,官方建议仅为这些框架添加引用,而不是关闭裁剪。详情见 .NET 10 中 NU1510 的行为说明。

注意事项

出现这条警告,表示 NuGet 将该直接引用视为可移除项。它不会根据 RegisterProvider 或 Encoding.GetEncoding(1252) 的调用判断代码是否使用了这个包。升级后,请按项目实际支持的目标框架检查依赖:如果只面向 net10.0,就移除冗余引用;如果仍支持需要该包的旧框架,则为相应框架保留条件引用。

备注:内容仅供参考。