从Windows类库引用.NET标准库

时间:2017-02-15 16:01:05

标签: c# .net 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"
    }
  }
}

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

如果我跑

dotnet restore

它也可以正常工作:

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.

3 个答案:

答案 0 :(得分:18)

在面向完整框架的项目中引用.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"/>

答案 1 :(得分:17)

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

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

在执行此操作时,您还应该直接在"NETStandard.Library" - 框架下移动"netstandard1.x" - 依赖项。

示例project.json

{
  "version": "1.0.0-*",

  "dependencies": { },

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

这可以确保您不会在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"
  }
}

正如@meziantou所描述的那样:

  

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

我刚刚在Visual Studio 2015中测试过,我可以确认 - 引用已添加,但您不能使用引用库的任何组件。

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

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

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

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

答案 2 :(得分:2)

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

可移植类库项目中提供了以下程序集:

  

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)

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