将 .NET Standard 库添加到 4.7.1 lib 会增加大量引用,有些已损坏

Adding .NET Standard libraries to 4.7.1 lib adds loads of references, some broken

因为我需要导入一个针对 .NET Standard 2 的库,所以我已经将我的库升级到 .NET 4.7.1,正如我从这个 MS 视频中了解到的那样应该可以避免这个问题:https://www.youtube.com/watch?v=u67Eu_IgEMs

但是,添加 .NET 标准现在会产生数十个 System.xxx 引用,而不是对 .NET 标准的单个引用(根据视频)。

更糟糕的是,已经添加了几个参考,但基础文件似乎缺少生成警告,例如 警告 找不到引用的组件 'Microsoft.Win32.Primitives'。 警告 找不到引用的组件 'System.IO.FileSystem'。 警告 找不到引用的组件 'System.Security.Cryptography.X509Certificates'。 警告 找不到引用的组件 'System.Globalization.Calendars'。<br> 警告 找不到引用的组件 'System.Security.Cryptography.Encoding'。 警告 找不到引用的组件 'System.Security.Cryptography.Primitives'。 警告 找不到引用的组件 'System.IO.Compression.ZipFile'。 警告 找不到引用的组件 'System.Console'。 我什至在视频中重新创建了演示项目并得到了相同的结果 - 没有对 .NET Standard 的单一引用,而是大量的 DLL 引用。

我已经尝试了 NUGET update-package -reinstall 并降级和升级到 .NET 标准 2.0 和 2.0.1

由于在 .NET Framework 4.7.1 上实现 .NET Standard 2.0 支持存在一些问题,因此需要将其他文件部署到您的 bin 文件夹中。

此问题被描述为已知问题 here

复制到输出文件夹的文件数在您定位时为 0,在 .NET Framework 4.7.2 上为 运行。

另请确保您使用的是最新的 Visual Studio(至少版本 15.6.3),因为其中提供了使此方案正常工作所需的一些更改。

我为自己的问题创建的答案是:

您的 .NET Framework 项目是否使用 packages.config?如果是,请勿 引用 .NET Standard 库。如果引入 .NET Standard,VS 2017 中的 package/reference/binding-redirect 会严重损坏。尝试修复它会导致更多问题(我已经浪费了好几天的时间)。期望有尽管存在但不加载的程序集、大量警告和损坏的应用程序。

如果您使用 System.Net.Http,计划花几天时间解决 Google 和 GitHub 问题,试图让它发挥作用。

如果您可以升级到 packageReferences,这应该可以解决问题。但是,如果您的项目包含导入内容的包,例如 JQueryBootstrap,请注意这些不再有效,您将花费更多时间尝试修复这些引用并迁移到 npmbower,同时修复 TypeScript 编译。不,谢谢。

理想情况下,您会使用 2017 csproj 格式,但它与 WinForms、ASP.NET 或 Windows 服务不兼容 - 如果您有遗留项目,那就太难了。

我遇到了完全相同的问题。我试图在空控制台 .NET Framework 4.7.1 项目上安装 Microsoft.Azure.ServiceBus 包,并获得了所有这些损坏的引用。

据我了解,根本原因是 https://github.com/dotnet/standard/issues/567 and the possible workaround described here https://github.com/dotnet/corefx/issues/29622#issuecomment-396753264

所以我只是替换了损坏的引用,例如

<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>

在我的 .csproj 文件中

<Reference Include="System.Security.Cryptography.Primitives"/>

它之所以有效,是因为该程序集是 .NET Framework 4.7.1 的一部分。我还从 .config 文件中删除了所有关于损坏引用的绑定重定向。

此外,我还发现了一个有趣的事实。有一个参考

<Reference Include="System.Runtime.Serialization.Primitives, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Runtime.Serialization.Primitives.4.3.0\lib\net46\System.Runtime.Serialization.Primitives.dll</HintPath>
</Reference>

它没有被破坏,因为这个程序集存在于 .../MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net471\lib 文件夹中。所以我想,会不会是MS build的问题?

FWIW,我使用的是 Visual Studio 15.7.5,并且正在手动修复我所有的绑定重定向(以删除它们)。但是,我注意到我的同事有 Visual Studio 15.9.4,并且在项目属性屏幕上现在有一个 'Auto generate binding redirects'。我之前在 csproj 中手动设置了它。但是,更新到 VS 15.9.4 并重新构建项目为我摆脱了所有绑定重定向。