什么是“.NET Core”?

344

最近,在官方.NET Framework博客上宣布,.NET Core将成为开源项目

具有讽刺意味的是,作者提到了下一篇文章将会解释什么是.NET Core。在另一篇公告文章中提到了更多细节。

从提供的图表:

.NET Core diagram

和文章本身来看,我认为除了被开源之外,.NET Core是完整.NET的模块化重新实现。即根据需要加载框架组件,就像现在加载NuGet包一样。而ASP.NET 5是已经实现的模块之一。我的理解正确吗?也许我错过了什么?


我找到了一篇最近的文章,它既简短又非常好。它涵盖了.NET Standard、.NET Core和.NET Framework以及它们之间的关系。我强烈推荐它。


5
这里有一篇关于此的新博客文章http://blogs.msdn.com/b/dotnet/archive/2014/12/04/introducing-net-core.aspx,但是那张图仍然很难理解。它的意思是WPF和WinForms不能使用.NET Core吗? - dodgy_coder
@dodgy_coder 我认为他们最终会的,只是Store Apps和ASP.NET 5是首批使用新框架架构的应用。 - Petr Abdulin
1
@dodgy_coder,你说得对。目前WPF和WinForms应用程序无法在.NET Core上进行移植。它们可能会被重新开发为Windows通用应用程序。请参阅此链接:https://blogs.msdn.microsoft.com/dotnet/2016/02/10/porting-to-net-core/ - VivekDev
这里有很多好的答案。用我的话来说,“它是dot net框架的重写,但这个重写是开源的,并且可以在Linux上运行”。请注意,这个重写不是一次性完成的,它是逐步增长的。还要注意的是,一些在dotnetFramework上的东西不能/不应该被移植过来,以便它可以在Linux上运行。(有时候在这个讨论中会有一些圣战)。由于C#是Java的重写,所以这是一个重写的重写……在我看来,事情非常干净……因为它能够干净地打破旧版本的依赖关系。再次强调,这只是“用我的话来说”的一部分。 - granadaCoder
11个回答

166

来自.NET博客宣布.NET 2015预览版:.NET的新时代

.NET Core有两个主要组件。它包括一个小型运行时,该运行时是从与.NET Framework CLR相同的代码库构建的。 .NET Core运行时包括相同的GC和JIT(RyuJIT),但不包括应用程序域或代码访问安全等功能。该运行时通过NuGet作为[ASP.NET Core]软件包的一部分提供。

.NET Core还包括基础类库。这些库基本上是与.NET Framework类库相同的代码,但已被分解(删除依赖项)以使我们能够发布更小的库集。这些库作为System.* NuGet软件包在NuGet.org上提供。

和:

[ASP.NET Core]是第一个采用.NET Core的工作负载。[ASP.NET Core]可在.NET Framework和.NET Core上运行。[ASP.NET Core]的一个关键价值在于它可以在同一台机器上运行多个版本的[.NET Core]。网站A和网站B可以在同一台机器上运行两个不同版本的.NET Core,或者它们可以使用相同的版本。
简而言之:首先有Microsoft .NET Framework,它由执行应用程序和库代码的运行时和一个几乎完全记录的 标准类库组成。
运行时是公共语言运行时(CLR),它实现了公共语言基础结构(CLI),与JIT编译器一起工作,以运行CIL(以前的MSIL)字节码
鉴于.NET的历史和目的,微软对.NET的规范和实现非常依赖于Windows和IIS,并且“臃肿”。虽然有较少的库、命名空间和类型的变体,但其中很少有用于Web或桌面开发,或者从法律角度来看难以移植

因此,为了提供一个非微软版本的.NET,在非Windows机器上运行,必须开发一种替代方案。不仅需要移植运行时,还需要移植整个框架类库以使其得到广泛应用。除此之外,为了完全独立于微软,还需要一个编译器来支持最常用的语言。

Mono是为数不多的,如果不是唯一的运行时的替代实现之一,可在除Windows之外的各种操作系统上运行,包括.NET 4.5中几乎所有命名空间的Framework Class LibraryVBC#编译器

.NET Core是runtime的开源实现,同时也是一个最小化的基类库。所有额外的功能都通过NuGet包提供,这些包会将特定的运行时、框架库和第三方包部署到应用程序本身中。
ASP.NET Core是MVC和WebAPI的新版本,与一个轻量级HTTP服务器抽象一起打包,可以在.NET Core运行时上运行,也可以在.NET Framework上运行。

4
哦,原来是我错过了!它实际上在博客的时间轴下面!太遗憾了... - Petr Abdulin
17
这些都是相当新的东西,描述得还不够充分。我认为你问了一个好问题。 :) - CodeCaster
3
仔细想想,似乎这不是“下一篇文章”,因为描述仍然相当简短。 - Petr Abdulin
3
自从他们通过NuGet开始发布框架以来,我们就一直在这样做。不需要使用那篇文章中的解决方法。 - ps2goat
2
你可能需要编辑你的回答。ASP.NET 5已经更名为ASP.NET Core 1.0 - rgvassar
显示剩余5条评论

86
它是.NET Framework的一个子集,始于Compact Framework版本。它发展成为Silverlight、Windows Store和Windows Phone。它专注于保持部署小型化,适用于快速下载和存储能力有限的设备。并且在非Windows平台上启动更容易,这无疑是选择开源版本的原因。CLR和基础类库中的“困难”和“昂贵”的部分被省略掉了。
否则,当您针对这样的框架版本时,总是很容易识别出会缺少许多好东西。您将使用一组不同的引用程序集,这些引用程序集仅公开运行时所支持的内容。它存储在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore目录中。
更新:在.NET Core 2.0发布之后,我看到了一些代表性的数字,可以给出较好的洞察。在过去的两年里,他们一直在努力将框架APIs向.NET Core进行回溯移植。.NET Core 1.0最初支持13,000个API。.NET Core 2.0添加了20,000个API,总数达到32,000个,并允许约70%的现有NuGet包进行移植。有一些API太紧密地与Windows相关,难以轻松地移植到Linux和MacOS。最近发布的Windows兼容性包覆盖了另外20,000个API。

4
从博客文章中,我不能说这看起来像另一个“轻量级”框架版本。宣布的.NET Core是版本5.0,比最新的完整框架高。我认为他们的意思是那是一些不同的东西。 - Petr Abdulin
5
我刚描述了.NET Core版本的历史。毫无新意,已经存在很长时间了。5.0版本的变化是渐进式的,新的RyuJIT x64 Jitter是目前我能想到的唯一的变化。只有许可证的变更是真正的新变化 :) - Hans Passant
3
我明白您的意思。尽管如此,我仍认为宣布框架子集作为.NET的下一个时代有点大胆。 - Petr Abdulin

53
我找到了一篇很好的最近文章(链接),它非常简短但很好地介绍了.NET Standard、.NET Core和.NET Framework以及它们之间的关系。我强烈推荐阅读该文章。不幸的是,我没有时间去适应并在这里发布它。
根据这个话题的官方条目,以下是我认为的一些关键点:
.NET Core本质上是.NET Framework的一个分支,其实现也针对因素进行了优化。
我们认为,.NET Core不特定于.NET Native或ASP.NET 5——BCL和运行时是通用的,并且设计成可模块化的。因此,它构成了所有未来.NET垂直领域的基础。
因此,.NET Native和ASP.NET 5只是新框架配置的测试“对象”,部分原因是它们非常不同。
如图所示,它们甚至需要单独的低级别,但BCL的主要部分仍然是共同的。
即,顶部的品红色矩形将随着新的应用程序模型大量添加,但基础将保持共同。
NuGet部署:
与.NET Framework相比,.NET Core平台将作为一组NuGet软件包提供。我们选择NuGet是因为大多数库生态系统已经在这里了。
与当前框架的关系:
对于Visual Studio 2015,我们的目标是确保.NET Core是.NET Framework的纯子集。换句话说,不会有任何功能差距。 Visual Studio 2015发布后,我们的期望是.NET Core的版本将比.NET Framework快。这意味着会有一些时间点,某个特定功能仅可在基于.NET Core的平台上使用。
总结:
.NET Core平台是一个面向开源开发和NuGet敏捷交付优化的全新.NET堆栈。我们正在与Mono社区合作,使它在Windows、Linux和Mac上变得更好,并且Microsoft将在这三个平台上支持它。
我们保留了.NET Framework为企业级开发带来的价值观。我们将提供代表一组NuGet软件包的.NET Core分发,我们测试并一起支持。Visual Studio仍然是您的开发一站式服务。消费分发中的NuGet软件包不需要互联网连接。
基本上,这可以被视为具有更改的分发模型的.NET 4.6版本,同时也正在成为开源过程中的一部分。

24

目前的文档已经很好地解释了.NET Core是什么以及应用领域等方面。以下特点最能代表.NET Core:

灵活的部署:可包含在您的应用程序中或安装在用户或机器范围内进行并行使用。

跨平台: 运行在 Windows,macOS 和 Linux 上,可以移植到其他操作系统。支持的操作系统(OSes),CPU和应用场景将随着时间的推移而增长,由Microsoft、其他公司和个人提供。

命令行工具: 所有产品场景都可以在命令行上执行。

兼容性: .NET Core 通过.NET Standard Library与.NET Framework、Xamarin和Mono兼容。

开源: .NET Core平台采用MIT和Apache 2许可证开源。文档使用CC-BY许可证。.NET Core是一个.NET基金会项目。

得到Microsoft的支持: .NET Core获得Microsoft的支持,符合.NET Core Support要求。

.NET Core包括以下内容:

.NET运行时,提供类型系统、程序集加载、垃圾回收器、本地交互性和其他基本服务。

一组框架库,提供原始数据类型、应用程序组合类型和基本实用程序。

一组SDK工具和语言编译器,使基本的开发者体验成为可能,在.NET Core SDK中可用。

'dotnet'应用程序宿主,用于启动.NET Core应用程序。它选择运行时和托管运行时,提供程序集加载策略并启动应用程序。同样的宿主也用于以类似方式启动SDK工具。


20

.NET Core是一个新的跨平台实现.NET标准(ECMA 335),类似于Mono,但由微软自己完成。

请查看learn.microsoft.com


19

微软意识到未来的Web开源范式,并决定将.NET开放给其他操作系统。.NET Core是适用于Mac和Linux的.NET Framework。它是一个“轻量级”的.NET Framework,因此缺少一些功能/库。

在Windows上,我仍然会运行.NET Framework和Visual Studio 2015。.NET Core更加友好于开源世界,如Node.js、npm、YeomanDocker等。

您可以使用Visual Studio Code + .NET Core在Mac或Linux上开发完整的网站和RESTful API,这在以前是不可能的。所以,如果你热爱Mac或Ubuntu,并且是个.NET开发人员,那就去尝试设置吧。

对于Mono和.NET Core的比较,Mono是为Linux开发的.NET Framework,现在已被微软(名为Xamarin的公司)收购并用于移动开发。最终,微软可能会将Mono合并/迁移到.NET Core。目前不必担心Mono。


14

来自 Microsoft官网

.NET Core 指包括 .NET Core、ASP.NET Core 和 Entity Framework Core 在内的几种技术。

与原生的 .NET 不同,这些技术使用 CoreCLR 运行时(用于通用 Windows 平台)。

正如您在问题中提到的那样,.NET Core 不仅是开源的,而且也是可移植的 [可以运行在 MacOS、Windows 和 Linux 上]。

.NET Core 的内部实现也被优化,以避免在核心库中不必要地使用不同的模块,除非应用程序需要。


5
".NET Core指的是包括.NET Core在内的几项技术"... 很棒。 - Kieren Johnstone

13

我今天在Visual Studio 2017中尝试创建一个新项目(最近从Visual Studio 2015升级)并注意到了新的项目类型选择。不知道它们是新的还是我很久没有开始新项目了!! :)

Visual Studio Screenshot

我看到了 这份文档链接,觉得很有用,所以分享给大家。文章中也提供了项目细节。我在此只列出要点:

You should use .NET Core for your server application when:

You have cross-platform needs.
You are targeting microservices.
You are using Docker containers.
You need high performance and scalable systems.
You need side by side of .NET versions by application.

You should use .NET Framework for your server application when:

Your application currently uses .NET Framework (recommendation is to extend instead of migrating)
You need to use third-party .NET libraries or NuGet packages not available for .NET Core.
You need to use .NET technologies that are not available for .NET Core.
You need to use a platform that doesn’t support .NET Core.

这个链接 提供了一个 .NET 术语词汇表。

2020年10月7日编辑 查看.NET 5.0 - "...只有一个 .NET,您将能够使用它来针对 Windows、Linux、macOS、iOS、Android、tvOS、watchOS 和 WebAssembly 等平台" 预计将于2020年11月发布。


5

.NET Core是一个针对Windows、Linux和macOS操作系统的免费开源的托管计算机软件框架。它是.NET Framework的跨平台后继者。

.NET Core应用程序支持在Windows、Linux和macOS上运行。简而言之,.NET Core类似于.NET Framework,但它是跨平台的,也就是说,它允许.NET应用程序在Windows、Linux和macOS上运行。.NET Framework应用程序只能在Windows系统上运行。因此,.NET Framework和.NET Core之间的基本区别在于,.NET Core是跨平台的,而.NET Framework仅在Windows上运行。

此外,.NET Core具有Microsoft内置的依赖注入功能,您不必使用第三方软件/DLL文件进行依赖注入。


1
你能详细解释一下依赖注入吗?在这个上下文中,它实际上是什么意思?你是指特定的框架吗?你有一些参考/链接吗? - Peter Mortensen

3

.NET Core是.NET Framework的开源跨平台版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接