Visual Studio 2017 不会在 .NET Standard 库中加载 .NET Framework 引用

Visual Studio 2017 won't load .NET Framework references in .NET Standard library

我已经安装了 Visual Studio 2017。我有一个新的 .NET Standard 格式的 class 库,它可以被 .NET Framework 和 .NET Core 使用。但是当我去 Add… Reference… Assemblies Framework, Visual Studio 转了半天然后说,

No Framework assemblies were found on the machine.

(这台机器还安装了 Visual Studio 2015,以及 .NET 4.6.1。)

我该如何解决这个问题?

我的 .csproj 文件当前如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="Utility\EncryptionUtility.cs" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Utility\" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Runtime.Caching" />
  </ItemGroup>

</Project>

更改目标框架来自:

<TargetFramework>netstandard2.0</TargetFramework>

<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>

允许我最终添加对 System.Runtime.Caching 的引用,但在扩展引用时它在 IDE 中有一个黄色警告图标。它包含在可折叠部分的 .NET 4.6.1 和 .NET Standard 下,Standard 下的引用也显示警告图标。构建失败,因为 IDE 声称引用仍然缺失。

尝试更改 .csproj 中 TargetFrameworks 的顺序。

来自

<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>

<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>

当同时针对 .NET Framework 和 .NET Core/.NET Standard 时,您几乎肯定需要使用 MSBuild Conditions 来防止 .NET Framework 引用渗入 .NET Core/.NET Standard .

MSBuild 条件已经存在了很长一段时间,但 Visual Studio 中不支持添加它们,您必须手动编辑 .csproj 文件。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="Utility\EncryptionUtility.cs" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Utility\" />
  </ItemGroup>

  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.Runtime.Caching" />
  </ItemGroup>

</Project>

Also note that once you do this, there are no guarantees it will work right to add a NuGet or other assembly reference using Visual Studio - you may need to do manual cleanup every time in the .csproj file to ensure the reference is added to the right conditional section. You are probably better off adding references by hand-editing the file every time.

在我这边,我已经尝试了之前提出的所有解决方案,但解决方案只是为 Microsoft.CSharp.

安装 NuGet 包

安装后只需清理项目并重新启动您的 IDE。

当我在只有 4.7.2 的全新安装 PC 上打开针对 4.7.1 的解决方案时,我遇到了这种情况

作为替代方案,您可以使用 .NET Standard Library from Nuget 包管理器来处理此问题:

.NET Framework 添加参考 window 中的消息是预期的。创建 .NET Standard 库时,NETStandard.Library 元包会在项目创建期间自动引用。它是一组建议一起使用和支持的标准 .NET API。这包括 NETStandard.Platform 包中的所有 API,以及作为 .NET 核心但构建在 NETStandard.Platform.

之上的其他库

这意味着我们不需要单独添加引用。

只需为相应的框架安装 .NET Framework 开发人员包,它就可以正常工作。