从 Windows Class 库引用 .NET Standard 库

Referencing a .NET Standard library from a Windows Class Library

目前我的解决方案中有两个项目:一个 Windows Class 库(针对 .NET Framework 4.6.1) 和另一个 class 以 .NET Standard 1.3. 为目标的库我正在使用 Visual Studio 2015 Update 3.

我从其他项目添加了对 .NET Standard 项目的引用,它出现在引用列表中,但我看不到引用的任何 classes 或命名空间当我想使用它们时的库(即使引用的库已成功构建并且没有错误)。

这是 .NET Standard 库项目的project.json:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}

我以为.NET 4.6.1 项目可以使用.NET Standard 1.3 库,我什至尝试使用较低版本(1.0),但结果是一样的。我在这里错过了什么?

如果我运行

dotnet 恢复

它也很好用:

log  : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.json...
log  : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.json...
log  : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.lock.json
log  : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\PWBSpreadsheet.Parser.xproj
log  : Restore completed in 408ms.
log  : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.lock.json
log  : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\PWBSpreadsheet.Entities.xproj
log  : Restore completed in 417ms.

您不能在 PCL 项目中使用某些库,因为它不是作为 PCL 构建的,也不是跨平台的。某些命名空间在 PCL 个项目中不可用,并且未列出 here

便携式 Class 库项目中提供了以下程序集:

mscorlib.dll

System.dll

System.Core.dll

System.Xml.dll

System.ComponentModel.Composition.dll

System.Net.dll

System.Runtime.Serialization.dll

System.ServiceModel.dll

System.Xml.Serialization.dll

System.Windows.dll (from Silverlight)

但是,并非所有平台都支持所有这些程序集。

从 Windows Class 库 引用 .NET Core 项目应该 是可能的。但是,.NET Standard 库不是 "directly compatible" 以前版本的 .NET Framework,即 4.6.1 或更低版本。 .NET Standard 库是一个,其组件已经存在在.NET Framework(例如4.6.1)中。区别在于 .NET Standard 库是为 cross-platform .NET Standard 框架构建的。

您可以在项目的 "frameworks" 部分下定位多个框架。json-file。

在这样做的同时,您还应该将 "NETStandard.Library"-依赖项直接移动到 "netstandard1.x"-框架下。

例子project.json

{
  "version": "1.0.0-*",

  "dependencies": { },

  "frameworks": {
    "net461": { },
    "netstandard1.3": {
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      },
      "imports": "dnxcore50"
    }
  }
}

这确保您不会包含任何对 NET Standard 库的多余依赖项,因为这些依赖项只会在构建 NET Standard 框架时包含。如果针对 .NET Framework 4.6.1 构建,则忽略这些依赖项。这很好——因为这些依赖项已经是 .NET Framework 的一部分(如上所述)。

现在举例来说,您想要引用的东西 不是 .NETStandard 库的一部分,而是 .NET 4.6.1 框架的一部分。在我的工作场所,这种情况的常见情况是 System.ComponentModel.DataAnnotations。它是 .NET Framework 的一部分,但是是 .NET Standard 框架的独立包。

然后您必须将其作为 "net461" 框架程序集 引用,但作为 依赖关系 "netstandard1.x"框架。

例子project.json

"frameworks": {
  "net461": {
    "frameworkAssemblies": {
      "System.ComponentModel.DataAnnotations": "4.0.0.0"
    }
  },
  "netstandard1.3": {
    "dependencies": {
      "NETStandard.Library": "1.6.0",
      "System.ComponentModel.Annotations": "4.1.0"
    },
    "imports": "dnxcore50"
  }
}

如@meziantou 所述:

Referencing .NET Standard in a project that targets the full framework does not work correctly yet.

我刚刚在 Visual Studio 2015 年对其进行了测试,我可以确认 — 引用已添加,但您不能使用引用库的任何组件。

如果你没有安装Visual Studio 2017,我能想到的唯一解决办法就是dotnet pack your project and publish it to a NuGet-feed. You may set up a local NuGet feed

然后只需在 NuGet 程序包管理器控制台中使用 Install-Package cmdlet。

Install-Package <your-package> -v 1.0.0-<x>

package-manager 将引用包的正确版本 (.NET 4.6.1)。

在以完整框架为目标的项目中引用 .NET Standard 尚不能正常工作。相反,您的项目必须针对多个框架。

如果您使用的是新工具(使用 VS 2017),即 csproj 项目格式,您可以在 TargetFrameworks 标签中设置多个目标:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
  </PropertyGroup>
</Project>

如果需要,您可以为每个目标设置不同的依赖关系:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3'">
    <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
    <PackageReference Include="System.Collections" Version="4.3.0" />
    <PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net46'">
    <PackageReference Remove="NETStandard.Library" />
  </ItemGroup>
</Project>

默认情况下会自动添加 NETStandard.Library。如果要删除它,请使用 PackageReference Remove="NETStandard.Library"/>.