PCL - 针对.NET 4.5.2和ASPNetCore 1.0

时间:2017-02-28 19:32:16

标签: c# asp.net asp.net-core .net-core portable-class-library

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

修正:

在安装2017.1 EAP 3之后,ReSharper成为一个问题,(从2016年开始)引用共享的.NET Standard 1.2项目工作得非常好!

问题

更新

通过将我的PCL的目标框架更改为.NET Framework 4.5而不是.NET Framework 4.6来管理以使其编译(不要问我它为什么有用,但肯定想知道为什么)。

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

enter image description here

原始错误

我收到编译错误,说它不兼容。

  1. 是否可以使用单个PCL定位.NET 4.5.2和DotNetCore(不使用尚未使用的.NET标准)
  2. 你是怎么做到的?
  3. 我可以在最新的VS 2017 RC中执行此操作吗? (或者我应该安装VS2015?)
  4. 错误消息

    enter image description here

    PCL目标

    enter image description here

    在AspNetCore中引用的PCL

    enter image description here

    AspNetCore 1.0项目设置

    enter image description here

    .NET标准实现

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

    enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

如果需要/必须使用不定位netstandard1.x的.NET 4.5 / 4.6库,则必须从ASP更改NETCoreApp1.0。 NET Core应用程序(不是PCL)项目设置为.NET Framework 4.5

  

我知道,但我必须针对Core 1.0未实现的.NET Standard 2.0。根据apisof.net,它在.Net Core 1.0中引用了System.Data.Common,但在2.0之前从未切入任何标准!

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

更新

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

为此你需要创建一个新的"类库(.NET标准)"项目和编辑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>

编译/打包时,它会创建两个二进制文件,一个用于netstandard1.2,另一个用于net451

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

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

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