为什么添加 "imports" 到 project.json 会破坏这个?

Why does adding an "imports" to project.json break this?

使用 Visual Studio 2015 更新 3,我创建了一个可移植的 class 库。然后我将其切换到目标 .NET Standard。

所以 project.json 文件基本上是这样的:

"dependencies": {
  "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
  "NETStandard.Library": "1.6.1"
},
"frameworks": {
  "netstandard1.3": {
  }
}

在创建的 Class1.cs 中,我添加了一个使用 Linq 中的 Any() 方法的简单方法:

static void foo()
{
    var x = new string[] { "hello", "world", };
    var q = x.Any(s => s.Contains("m"));
}

并且一切正常。

现在,我希望这个库能够引用具有 PCL 配置文件的 nuget 包,即尚未更新到 netstandard 的包。我的理解是我需要在 project.json 文件的 "frameworks" 部分中使用 "imports" 部分。所以,我添加这个:

"frameworks": {
  "netstandard1.3": {
    "imports": ".NETPortable,Version=v4.6,Profile=Profile151"
  }
}

并且不进行其他更改。

现在构建失败:

错误 CS1061 'string[]' 不包含 'Any' 的定义,并且找不到接受类型 'string[]' 的第一个参数的扩展方法 'Any'(您是否缺少using 指令还是程序集引用?)

似乎只是说我们可以接受配置文件 151 PCL,构建已丢失 System.Linq。

更改为 netstandard 1.2 或 1.4 或 1.5 似乎没有什么区别。

将 "imports" 值更改为其他 PCL 配置文件似乎并不重要。

将 "imports" 值更改为其他形式,例如 "portable-net45+win8+wp8+wpa81",似乎并不重要。

将 "imports" 值更改为 "fubar" 确实会 导致有关无效框架的额外错误,正如人们所预料的那样。

有人知道为什么会这样吗?

我相信您需要采用 portable-win8+wpa81+wp8+net45 等形式的导入。而不是您拼写的完整 TFM。它还需要一个数组,因此您可以指定多个。

此外,虽然 csproj + project.json "supposed" 可以在 VS 2015 中工作,但可能存在错误....无法修复。

我强烈建议使用最新的 VS 2017 RC 并创建一个新的 .NET 标准 Class 库。然后您可以使用 <PackageTargetFallback> 指定您需要的后备 TFM(由 ; 分隔)