PCL - 以 .NET 4.5.2 和 ASPNetCore 1.0 为目标

PCL - Targetting .NET 4.5.2 and ASPNetCore 1.0

我有一个 PCL,我的目标是 .NET 4.5.2 和 ASP.NET Core 1.0,但是每当我从我的 DotNetCore AspNetCore 1.0 应用程序中引用这个 PCL 时。

修复:

原来是 ReSharper 的问题,在安装 2017.1 EAP 3 之后,(从 2016.3 开始)引用共享的 .NET Standard 1.2 项目工作得非常好!

问题

更新

设法通过将我的 PCL 的目标框架更改为 .NET Framework 4.5 而不是 .NET Framework 4.6 来编译它(不要问我为什么它有效,但肯定会喜欢找出原因)。

现在编译成功,但我的 IDE 没有正确解析引用

原始错误

我得到一个编译错误,说它不兼容。

  1. 是否可以有一个单一的 PCL 针对 .NET 4.5.2 和 DotNetCore(不使用尚未发布的 .NET Standard)
  2. 你是怎么做到的?
  3. 我可以在最新的 VS 2017 RC 中执行此操作吗? (或者我应该安装 VS2015 吗?)

错误信息

PCL 目标

PCL 在 AspNetCore 中引用

AspNetCore 1.0 项目设置

.NET 标准实现

我无法使用 .NET Standard 的原因突出显示如下:

在您的屏幕截图中,您可以看到您的 ASP.NET 核心应用程序的目标是 NETCoreApp1.0

NO CIRCUMSTANCES 下,您可以在 .NET Core 中使用 .NET 4.5 库。您必须 library/package 以 netstandard1.x 为目标(在您的情况下为 1.2,如果最小 API 是 .NET 4.5.1 或 4.5.2)或以兼容的 PCL(即 portable-net45+win8 或类似的)。

如果您need/have到使用不针对netstandard1.x的.NET 4.5/4.6库,那么您必须更改NETCoreApp1.0 从您的 ASP.NET 核心应用程序(不是 PCL)项目设置到 .NET Framework 4.5

I know, but I would have to target .NET Standard 2.0 which isn't implemented by Core 1.0. Where as according to apisof.net it is referenced System.Data.Common in .Net Core 1.0 but never made the cut into any of the Standards until 2.0!

但是你不能只在 .NET Core 上 运行 Linux/MacOS 它。这限制了您在 Windows 上使用 ASP.NET 核心应用程序或在 Linux/MacOS.

上使用 Mono

更新

使用 .NETStandard,您还可以同时针对 net451netstandard1.x,并使用预处理指令有条件地将代码编译到其中一个程序集中。

为此,您需要创建一个新的“Class Library (.NET Standard)”项目并编辑 project.json(如果您使用的是 VS2015)或 csproj (VS2017) 以添加目标。

project.json

  "frameworks": {
    "netstandard1.2": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ],
      "dependencies": {
        "Some.NetCore.Only.Dependency": "1.2.3"
      }
    },
    "net451": {
      "dependencies": {
        "Some.Net451.Only.Dependency": "1.2.3"
      }
    }
  },

或csproj文件

<PropertyGroup>
  <TargetFramework>netstandard1.2;net451</TargetFramework>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
  <!-- Framework references -->
  <Reference Include="System.Runtime.Serialization" />
  <!-- Framework references -->
  <PackageReference Include="Some.Net451.Only.Dependency" Version="1.2.3" />
  <!-- Projects within solution references -->
  <ProjectReference Include="My.Domain.Core" Version="1.0.0" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.2' ">
  <PackageReference Include="Some.NetCore.Only.Dependency" Version="1.2.3" />
</ItemGroup>

当 compiled/packaged 时,它将创建两个二进制文件,一个用于 netstandard1.2,一个用于 net451

在代码中,使用众所周知的 #if 指令(有关 netstandard 指令列表,请参阅 here

#if NETSTANDARD1_2
using Some.NetStandardOnly.Namespace;
#endif
using System;

#if NET451
public DataTable GetDataTable() 
{
    ...
}
#endif