.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-Sharp、C# 程序和 sdk 将允许您编译用 C-Sharp、C# 编写的程序。
请务必了解,您可以安装多个运行时和多个 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/<runtime version>
是运行时。 shared/Microsoft.AspNetCore.App,All/<aspnetcore version>
包含 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() 有啥区别?