.NET Core 中的 SDK 和运行时有啥区别?

Posted

技术标签:

【中文标题】.NET Core 中的 SDK 和运行时有啥区别?【英文标题】:What's the difference between SDK and Runtime in .NET Core?.NET Core 中的 SDK 和运行时有什么区别? 【发布时间】:2018-05-23 19:12:59 【问题描述】:

我看了很多文章,包括this one,但我仍然无法弄清楚有什么区别,他们也没有简单地解释或根本没有解释。

有人可以澄清.NET SDK 和.NET Runtime 之间的区别吗?

更新:使用比较将不胜感激。简单英语的类比具有很高的教育意义。

【问题讨论】:

SDK 用于构建应用程序。运行时是运行应用程序。 【参考方案1】:

根据.Net Core Guide,.NET Core 由以下几项组成

.NET 运行时,提供类型系统、程序集加载、垃圾收集器、本机互操作和其他基本服务。 一组框架库,提供原始数据类型、应用组合类型和基本实用程序。 .NET Core SDK 中提供了一组可实现基本开发人员体验的 SDK 工具和语言编译器。 “dotnet”应用主机,用于启动 .NET Core 应用。它选择运行时并托管运行时,提供程序集加载策略并启动应用程序。同一个主机也用于以几乎相同的方式启动 SDK 工具。

SDK 提供了所有需要/使开发 .NET Core 应用程序更容易的东西,例如 CLI 和编译器。

运行时是托管/运行应用程序并抽象与基本操作系统的所有交互的“虚拟机”。

运行应用程序只需要后者,而开发应用程序需要前者。

【讨论】:

这是否意味着用户必须同时安装(SDK + Runtime)才能开发应用程序,还是意味着SDK只是因为它还包含运行时才需要? @Puchacz 我刚刚下载了 SDK 安装程序,它还包含 Core Runtime 和 Asp.Net Core Runtime。 这对我来说毫无意义。调用 CLI 以执行“框架相关”可执行文件,例如dotnet myapp.dll 如果需要 cli 来运行应用程序,它究竟如何成为运行时的一部分? 这也不能回答核心库是运行时还是 SDK 的一部分。 运行时也包含在 SDK 中【参考方案2】:

运行时:运行应用程序

SDK(运行时 + 工具):构建和运行应用程序

【讨论】:

我有一个问题,在从 Visual Studio 运行我的应用程序之前,需要先构建它吗?然后我总是需要一个 SDK 而不仅仅是运行时。 编译语言需要先编译。无论您使用什么 IDE,都需要 SDK 才能将源代码构建到应用程序中。 Runtime 真的是 SDK 的一部分,还是只是作为 SDK 安装程序的一部分与 SDK 一起打包的 Runtime? 在这种情况下,什么是“应用程序”?【参考方案3】:

我没有在这里发明任何东西。只需复制粘贴 https://dotnet.microsoft.com/download 中的定义即可

软件开发工具包 (SDK) 包含使用命令行工具和任何编辑器(如 Visual Studio)构建和运行 .NET Core 应用程序所需的一切。

运行时 包括运行 .NET Core 应用程序所需的一切。运行时也包含在 SDK 中。

【讨论】:

【参考方案4】:

分享自 Rick Strahl 的帖子:Which .NET Core Runtime Download do you need?

仅需要 .NET Core 运行时来运行应用程序并提供有关安装的信息。

开发、构建和发布应用程序需要 SDK。

dotnet.exe 使用运行时安装进行安装,但它仅提供 核心功能 以提供信息以运行应用程序并提供有关安装的信息:@ 987654325@dotnet --info。要构建、发布或执行任何其他操作,您需要安装 SDK。

运行以下命令将提供有关安装的信息:

dotnet --info

如果命令失败,则意味着您没有安装 .NET Core 运行时或在系统的 PATH 中可用。

以下是该命令的示例输出。

$ dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   2.2.101
 Commit:    236713b0b7

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.13
 OS Platform: Darwin
 RID:         osx.10.13-x64
 Base Path:   /usr/local/share/dotnet/sdk/2.2.101/

Host (useful for support):
  Version: 2.2.0
  Commit:  1249f08fed

.NET Core SDKs installed:
  2.1.4 [/usr/local/share/dotnet/sdk]
  2.1.302 [/usr/local/share/dotnet/sdk]
  2.2.101 [/usr/local/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.2.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.2.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.0.5 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.2.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

输出告诉你:

已安装的 SDK 版本 运行此 dotnet 命令的活动运行时版本 所有已安装运行时和 SDK 的列表

安装 SDK 也会安装运行时。


macOS 自制程序特定

安装 homebrew-cask dotnet 会与 dotnet-sdk 冲突,所以要同时获取运行时和 sdk 安装 dotnet-sdk

brew cask install dotnet-sdk

简而言之,runtime 将允许您的操作系统运行已编译的 C-SharpC# 程序和 sdk 将允许您编译用 C-SharpC# 编写的程序。


请务必了解,您可以安装多个运行时和多个 SDK,并且每个项目可以使用不同的。运行时由 .csproj 文件中项目的运行时说明符确定:

<TargetFramework>netcoreapp2.1</TargetFramework>

SDK 是最后一个全局安装的默认 SDK,或者您可以在解决方案根文件夹中的 global.json 中显式覆盖 SDK。以下明确强制我的项目使用最后一个 RC SDK,而不是 RTM 版本:


 "sdk": 
   "version": "2.1.300-rc.31211"
 

一般情况下,不需要使用特定的较低 SDK 版本,因为 SDK 向后兼容并且可以将各种版本的 .NET Core 应用程序编译回 v1.0。 IOW,几乎所有情况下都可以使用最新的 SDK。

.NET Core 运行时

.NET Core 运行时是最小的独立和特定组件,包含在特定平台上仅运行 .NET Core 的绝对最小值。

请注意,运行时安装不包括 ASP.NET Core 元包运行时依赖项,因此如果您的应用程序引用 Microsoft.AspNetCore.App 或 Microsoft.AspNetCore.All,您必须单独下载 ASP.NET Core 包。但是,如果您明确引用所有 ASP.NET Core Nuget 包而不是使用元包,则这些包将作为应用程序的一部分进行部署,并且可以仅使用运行时运行。

本质上,您是在交易安装包大小与运行时预安装要求。

参考资料:

Which .NET Core Runtime Download do you need?

【讨论】:

为什么Microsoft.AspNetCore.App 列在运行时下?我以为 CLR 会是一个运行时? @Robotron 你是对的。只有shared/Microsoft.NETCore.App/&lt;runtime version&gt; 是运行时。 shared/Microsoft.AspNetCore.App,All/&lt;aspnetcore version&gt; 包含 ASP.NET Core 库。 docs.microsoft.com/en-us/dotnet/core/build/…【参考方案5】:

SDK 提供了所有需要/使开发 .NET Core 应用程序更容易的东西,例如 CLI 和编译器。

运行时是托管/运行应用程序并抽象与基本操作系统的所有交互的“虚拟机”。

【讨论】:

【参考方案6】:

总结如下: 如果您安装 SDK,您将拥有开发和运行应用程序所需的一切。

【讨论】:

【参考方案7】:

如果您只安装了 .Net Core Runtime,请添加到 Stormwild 的答案中,您将收到来自 dotnet --info

的以下输出
>PS C:\Users\Administrator> dotnet --info
>
>Host (useful for support):
>  Version: 2.2.3
>  Commit:  6b8ad509b6 
>
>.NET Core SDKs installed:
>  No SDKs were found.
>
>.NET Core runtimes installed:
>  Microsoft.NETCore.App 2.2.3 [C:\Program 
>Files\dotnet\shared\Microsoft.NETCore.App]

【讨论】:

【参考方案8】:

SDK 通常包含文档和其他帮助文件。运行时仅包含用于安装的二进制文件。

【讨论】:

你确定吗?它安装的远不止这些。 SDK 包含有助于开发 .net 核心应用程序的工具,例如编译器。运行时托管一个 .net 核心应用程序并处理与底层操作系统的所有交互。【参考方案9】:

如果我们只想在硬件上运行应用程序,运行时就足够了,否则开发和运行我们需要 SDK(包括运行时和工具)。

【讨论】:

【参考方案10】:

当您安装 SDK 时,您还可以在其中获得运行时。看看下面这个,这是我们安装 SDK 时安装的。

以下安装在 C:\Program Files\dotnet • .NET Core SDK 2.2.100 • .NET Core 运行时 2.2.0 • ASP.NET Core 运行时 2.2.0

【讨论】:

以上是关于.NET Core 中的 SDK 和运行时有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Google Colab 中的本地运行时和托管运行时有啥区别?

.NET Core 身份验证中的 AddJwtBearer 和 AddOpenIdConnect 有啥区别?

ASP.NET Core 2.1 中的 UseStaticFiles、UseSpaStaticFiles 和 UseSpa 有啥区别?

asp.net core中的Host和WebHost类有啥区别

ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有啥区别?

.net core 3.0和.net5有什么区别