.NET 5和Mono

18

.NET 5 被吹捧为 .NET Core 和 .NET Framework 的彻底统一,将在 Mac、Windows 和 Linux 上运行。

Mono 是 .NET Framework 的重新实现,允许 .NET 应用在 Linux 上运行。

因此,可以认为一旦 .NET 5 广泛用于新开发,Mono 基本上会变得过时,并且只有针对遗留应用程序才需要使用,还是有一些方面仍然需要它吗?


https://devblogs.microsoft.com/dotnet/introducing-net-5/ - SushiHangover
你的假设可能是有根据的,但来自微软博客的言论应该谨慎消化。MonoDevelop 的停止开发可能是 Mono 作为一个整体走向这一趋势的一个很好的指标。 - Lex Li
1
然而,Mono支持更多的CPU架构和操作系统。 - Michal Dobrodenka
1
更不用说Winforms(在Linux上)^^(是的,我喜欢Winforms) - ggo
@ggo 我是个 masochist(受虐狂)... 但我有点困惑于依赖 mono 运行的软件,比如 Hadoop .Net 支持会发生什么。 - Luk164
@LexLi 这可能是一个不错的指标,但 MonoDevelop 已经有几年没有保持最新和最好的状态了。我记得我转向 Rider 是因为它更加完善,几乎我认识的每个 C# 开发者也都这么做了。我想随着这个变化,很多贡献者也离开了。 - aequabit
2个回答

35
我会这样回答这个问题…… .NET Framework是由Microsoft编写的,他们已经发布了许多版本(目前为4.8)。 有很多方法可以考虑.NET技术栈,但是对于本篇文章来说,.NET包含以下组件: - 编译器套件(C#,F#,VisualBasic .NET) - 基础类库(BCL) - 运行时(执行编译后的CIL所需的位)
Mono项目被创建用于实现完全开源的.NET Framework克隆版。 最初,Mono自己实现了所有以上内容。例如,有一个Mono本地C#编译器(mcs),一个Mono实现的ASP.NET,甚至是一个Mono实现的Windows Forms。随着时间的推移,Microsoft开始以开源方式发布一些东西。Mono开始整合它们,因此Microsoft .NET和Mono开始共享许多通用的代码(例如Roslyn C#和VB.NET编译器,ASP.NET MVC和DLR)。甚至一些BCL代码也被打开并在Mono和.NET之间共享。不过运行时不是如此。 Mono项目的一些贡献者成立了一家名为Xamarin的公司,其目标是使用Mono为移动操作系统(如iOS和Android)创建应用程序。他们增强了并重用了Mono运行时(例如添加了一个复杂的AOT编译器)。他们还重新使用了Mono BCL,尽管某些BCL的部分不能使用,并添加了用于平台特定元素(特别是GUI元素)的新API。还创建了一个“跨平台”移动GUI API(称为Xamarin Forms)。因此,虽然Microsoft .NET仍然只能在Windows上运行,但Mono可以用于创建Mac、Linux、Windows、iOS、Android和其他应用程序。
最近,Microsoft创建了自己的并行重新构想.NET生态系统的版本。他们将这个新版本称为.NET Core。像Mono一样,.NET Core是开源和多平台的。为了区分这两个Microsoft实现,原始的.NET被重新命名为.NET完整框架或仅.NET Framework。虽然.NET Framework仍然只适用于Windows,但.NET Core允许应用程序在Windows、MacOS和Linux上运行。 .NET Core与.NET Full Framework共享很多内容。例如,.NET core使用Roslyn编译器套件。不过,BCL是新的(与.NET Full Framework部分不兼容)。运行时完全是新的(例如使用RyuJIT)。 .NET Core并没有“替换”掉.NET Full Framework。例如,无法使用.NET Core创建Windows Forms和Windows Presentation Foundation(WPF)应用程序。
因此,.NET发现自己有多个实现:.NET Framework、.NET Core、Mono和Xamarin。所有这些版本都非常相似,但在某种程度上不兼容。Microsoft试图通过创建“.NET Standard”的概念来解决这个问题,目的是指定可以预期在任何上述.NET版本中执行的共享子集。
实际上,还有另一种.NET分支,即Microsoft创建了名为Blazor的东西,它将.NET应用程序编译成Web Assembly(WASM)。 Blazor使用Mono / Xamarin运行时。 作为混淆的另一个级别,.NET Core倡议产生了一些可以在.NET Core或.NET Full Framework上运行的位。例如,ASP.NET Core是ASP.NET MVC的重新构想。ASP.NET Core是.NET Core上唯一的ASP.NET版本,但Mono和.NET Framework开发人员都可以选择使用ASP.NET Web Forms、ASP.NET MVC或ASP.NET Core。不过,在ASP.NET Core本身之外,.NET Core和.NET Framework之间的BCL是不同的,因此很可能创建一个ASP.NET Core应用程序无法在.NET Core

1
如果有人在新存储库中寻找Mono运行时,它只是与CoreCLR运行时相同存储库下的一个目录:https://github.com/dotnet/runtime/tree/main/src/mono - Ivan
2
+1 很棒的答案。我喜欢.NET 5和6,但遗憾的是即使使用Windows TFM net5.0-windowsnet6.0-windows,某些东西也没有被包含在内。像_child App Domains、Code Access Security、Partially Trusted Code、GAC_这些东西,在你想要拥有强大的沙盒来托管第三方插件时是必需的(但是我们需要多少次呢)。:( - user585968
2
对于任何寻求全面答案的人来说,这是一个绝佳的总结。 - Spanners

12

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