从Windows类库引用.NET标准库

Bed*_*ord 17 .net c# portable-class-library .net-standard

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

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

这是.NET标准库项目的project.json:

{
  "version": "1.0.0-*",

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

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为.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.
Run Code Online (Sandbox Code Playgroud)

mez*_*tou 18

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

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

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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


die*_*aus 17

应该可以从Windows类库引用.NET Core项目.但是,.NET标准库与以前版本的.NET Framework"不直接兼容",即4.6.1或更低版本..NET标准库是一个包含 .NET Framework 中已存在的组件的(例如4.6.1).不同之处在于.NET标准库是为跨平台.NET标准框架构建的.

您可以"frameworks"在project.json文件中的部分下定位多个框架.

在执行此操作时,您还应该"NETStandard.Library"直接在"netstandard1.x"-framework 下移动-dependency.

示例project.json

{
  "version": "1.0.0-*",

  "dependencies": { },

  "frameworks": {
    "net461": { },
    "netstandard1.3": {
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      },
      "imports": "dnxcore50"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这可以确保您不会包含任何对.NET标准库的多余依赖项,因为这些依赖项只有在构建.NET标准框架时才会包含在内.如果针对.NET Framework 4.6.1构建,则省略这些依赖项.这很好 - 因为这些依赖项已经是.NET Framework的一部分(如上所述).

现在说比如你想引用一些属于.NETStandard库的东西,而是.NET 4.6.1框架的一部分.我工作场所的常见情况是System.ComponentModel.DataAnnotations.它是.NET Framework的一部分,但是.NET标准框架的单独包.

然后,您将不得不引用它作为一个框架组件"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"
  }
}
Run Code Online (Sandbox Code Playgroud)

正如@meziantou所描述:

在针对完整框架的项目中引用.NET Standard无法正常工作.

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

如果您没有安装Visual Studio 2017,我能想到的唯一解决方案是dotnet pack您的项目并将其发布到NuGet-feed.您可以为此设置本地NuGet源.

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

Install-Package <your-package> -v 1.0.0-<x>
Run Code Online (Sandbox Code Playgroud)

包管理器将引用包的正确版本(.NET 4.6.1).

  • 由于转移到.net标准的csproj,答案现已过时 (3认同)