为什么 .NetCore Class 库引用 .NetStandard?

Why does the .NetCore Class Library reference .NetStandard?

在 VS2015 > 新建项目 > .Net Core 中,有 "Class Library (.NET Core)"

的模板

直到我尝试在 .NET Core Web API 程序中引用此库,我才意识到 Class 库模板正在引用 .NETStandard v1.6。而我的 .NET Core API 项目不会将其作为参考。我试图避免将库构建为 nuget 包。

关于核心模板为何不引用核心的任何想法? 关于快速解决方法的任何想法?

更新: 打开一个新的 "Class Library (.NET Core)",在第一次构建之前,我将 project.json 中的框架更改为

"netcoreapp1.0": { "imports": [ "dotnet5.6", "portable-net45+win8" ]

然后我在不同的 VS 实例中创建了一个新的 "ASP.NET Core Web Application (.NET Core)"。

我尝试为新的 class 库添加对 .dll 文件的引用,现在在 netcoreapp1.0 文件夹中,但我仍然遇到相同的错误:

.NET Core Projects only support referencing .NET framework assemblies in this release.

如何解决您的问题

I was trying to avoid building the library as a nuget package.

Any ideas on why a Core template isn't referencing core? Any ideas on quick workarounds?

当您尝试添加 .dll 作为 API 的引用时,您的错误消息应该在某处说明您需要创建一个程序包才能使用该 class 库。它被描述为 in the documentation.

然而,如果您不想费心制作一个包,例如,如果您的 class 库现在仅在您的 API 项目中使用,最简单的方法是构建您的 class 库作为 API 所在的解决方案的项目。为此,请将您的代码复制并粘贴到解决方案文件夹中并将其作为项目包含在内。

关于版本和框架的一些解释

Core 模板(我猜你说的是 .NET Core API)应该创建一个 project.json 和

  "frameworks": {
    "netcoreapp1.0": {
         "imports": [
             "dotnet5.6",
             "portable-net45+win8"
       ]
    }
  }

让我们看看这些行负责什么:

    frameworks 下的
  • netcoreapp1.0 表示您的 API 以框架 .NET Core 1.0 为目标。那个版本的 .NET Core 框架实现了 .NET Standard 1.6 (the list here) 好东西:你的 Class 库也使用这个 .NET Standard 1.6。了解您的 Class 库使用的 .NET Standard 1.6 后,您就可以选择以后要开发 Web app/Mobile 时可以使用的 .NET Core/Xamarin/.NET Framework 版本] app/Windows 例如软件
  • imports 列出了您的应用程序可以使用的其他 frameworks/version 个软件包
  • 根据 this link dotnet5.6portable-net45+win8 已弃用,应使用 netstandard 版本。 dotnet5.6对我来说还是很神秘。 portable-net45+win8 等同于 netstandard1.0。如果允许,则意味着您的应用程序可以使用使用 .NET Standard 1.0 的包。这可能是个问题,因为 .NET Core 1.0 从 .NET Standard 1.6 开始,所以我实际上会删除这两行。

话虽这么说,我非常欢迎发表评论!

其他答案(在此之前)似乎没有说到重点。 .NET Standard 是编写 .NET class 库的前进方向,因为它遵循一组标准 API,这些 API 可以 运行 几乎所有 .NET 运行 时代(完整框架,. NET 核心,Mono Xamarin...)

所以如果你想写一个 .NET core 库,你实际上是在写一个 .NET Standard 库。无需区分它们。对 .NET standard 1.6 的引用是为了让编译器知道要针对什么进行编译。 netcoreapp1.0 基本上用于 .NET core 控制台应用程序。 netcoreapp1.0 项目将编译为可以执行的 dll(包含像 static void Main() 这样的程序入口)

所以你不能把它放在图书馆里是有道理的:)