【问题标题】:Adding .NET Standard libraries to 4.7.1 lib adds loads of references, some broken将 .NET Standard 库添加到 4.7.1 库会添加大量引用,其中一些已损坏
【发布时间】:2018-03-30 07:46:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • this GitHub issue 是你遇到的吗?
  • 不确定是@FrankFajardo,但感谢您的指点。它指的是 4.6.1,我知道它不支持 netstandard 2.0。我尝试在 MS 视频中创建演示应用程序(一个引用 .netstd 2 库的控制台应用程序,并得到了类似的结果 - 所以我认为这一定是 netstd 支持的问题..
  • 没有什么可以“参考”与 .NET Standard 相关的,它是一个“目标”。库目标只是声明其 API 兼容性。因此,不清楚您要做什么或要问什么。
  • 此外,您列出的缺失项是 .NET Framework(特定于 Windows),因此 .NET Standard 库无法引入这些依赖项。
  • @McGuireV10 我正在引用一个以 netstandard 作为目标的库,来自一个目标为 4.7.1 的库。- 应该 意味着它不会创建大量 shim库,但它没有

标签: c# .net .net-standard-2.0


【解决方案1】:

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

您的 .NET Framework 项目是否使用 packages.config ?如果是,请勿参考 .NET Standard 库。如果您引入 .NET Standard,VS 2017 中的包/引用/绑定重定向将严重损坏。试图修复它会导致更多问题(我已经浪费了几天时间尝试)。预计会有尽管存在但仍无法加载的程序集、大量警告和损坏的应用程序。

如果您使用System.Net.Http,请计划在 Google 和 GitHub 问题上花费几天时间来尝试使其发挥作用。

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

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

【讨论】:

    【解决方案2】:

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

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

    当您以 .NET Framework 4.7.2 为目标或在 .NET Framework 4.7.2 上运行时,复制到输出文件夹的文件数将为 0。

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

    【讨论】:

    • 谢谢亚历克斯。是的,我使用的是 VS 15.6.4。已知问题并不能解释为什么我会收到损坏的参考资料(尽管它可能是相关的)。奇怪的是,我将一个 vb.net 库升级到 4.7.1 并且那里没有参考错误..!将标准与框架混合时的用户体验确实需要改进..
    • 我已将此标记为答案。基本上,我发现 NET Standard 与 Framework anything 的兼容性绝对是错误、警告、绑定重定向等的噩梦。我已经浪费了一周的时间来尝试修复错误、升级项目、降级项目等。我认为我的结论是 .NET Standard 适合 .NET Core,如果你有一个框架应用程序,应该像瘟疫一样避免
    • 哦,在你说“4.7.2”之前,我尝试升级到它,现在它已经发布了,而且更坏了。由于库未加载和 2691 警告,我现在有 2012 错误。不错
    • 很遗憾听到这不能解决您的问题。根据我的理解,.NET Framework 4.7.2 应该可以解决您的问题。如果没有,我真的很想知道为什么它没有,看看可以做些什么来解决它。
    • 欢迎直接与我联系 (# ghiondea [d_o_t]alexandru [a__t] microsoft.com #)。我想了解为什么您仍然会看到 .NET Framework 4.7.2 的问题
    【解决方案3】:

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

    据我了解,根本原因是https://github.com/dotnet/standard/issues/567 和此处描述的可能解决方法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 的问题?

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-05
        • 2016-03-30
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 1970-01-01
        • 2011-04-24
        相关资源
        最近更新 更多