一文看懂.NET的各种变体

曾几何时,我们只有一个.NET,叫作.NET Framework。如果想要开发.NET应用程序,只要使用.NET Framework即可,非常简单。几年之后,出现了.NET变种的寒武纪大爆发(我们称之为“.NET大爆炸”):.NET Framework Client Profile、.NET Compact Framework、.NET Micro Framework、Windows Runtime、Universal Windows Platform、Mono、Xamarin、.NET Core和.NET Standard。就像来自寒武纪大爆发的有机体一样,.NET的很多变种最终都已经灭绝:它们不再被支持或不再被更新。有些变种只有一点点的立足之地,被用在非常专业化的领域。还有一些变种(“.NET幸存者”)蓬勃发展,目前正在发展壮大,因为一些特定的原因和用途。本文的目标不是要深入到各种.NET的技术细节中,关于技术细节已经有大量的技术资源可参考。相反,本文的目的是澄清一个简单的问题:在特定情况下应该使用哪种.NET?

ASP.NET Core应用开发

作者:[美] James Chambers,David Paquette,Simon Timms著 杜伟 涂曙光 柴晓伟 译

当当 广告
购买

.NET Framework

.NET Framework是最初的.NET实现,其他所有.NET都来自它。无论是支持的API数量还是下载量,它都是.NET中最大的一个。多年来,.NET Framework发布了很多版本,每个版本都增加了新的API和功能。.NET Framework由微软开发和支持,并且只能在Windows上运行。

如果你的应用程序只在Windows上运行,那么就应该使用.NET Framework。由于它支持的API数量最多,此如果选择了.NET Framework,就无需担心是否可以轻松完成一些复杂的任务。不过,如果你希望应用程序从一开始就在Windows以外的平台上运行,或者希望将来在非Windows平台上运行应用程序,那么就要考虑使用不同的.NET类型。

Mono

Mono是.NET的一个开放源代码实现,旨在与.NET Framework兼容,但可以在不同的平台上运行,包括Windows、MacOS和Linux。该项目由爱好者创建,并由Miguel de Icaza领导,他相信.NET的优势也应该被移植到除Windows之外的平台上,而实现这一目标的最佳方式就是开源。Mono的管理权随着de Icaza从一家公司迁移到另一家公司:从Ximian到Novell,再到Xamarin,最后到了微软。

Mono覆盖到的.NET API并不完整,但已经很好了。从.NET Framework移植到Mono非常简单,即使是在API覆盖不到位的情况下,也有相对简单的解决方法。

Mono仍然是跨平台.NET的可行之选,尽管微软似乎将大部分跨平台.NET工作转移到了.NET Core中。所以如果你对.NET的未来有所期待,应该要考虑到这一点。此外,Xamarin/微软现在似乎将他们Mono的大部分工作集中在Xamarin平台和支持iOS和Android上,尽管Mono对桌面和服务器平台的支持似乎也很活跃。总之,如果你有一个运行在Windows上的.NET Framework应用程序,并且希望你的应用程序支持Windows、macOS、Linux、BSD等平台,但只想花费很少的精力来转换你的应用程序,那么Mono可能是你最好的选择。

.NET Core

.NET Core是另一个开源的跨平台.NET实现,由微软领衔。它支持Windows、MacOS和Linux。最初,.NET Core是一个轻量级的实现:强大到足以支持ASP.NET和控制台应用程序,但又不会太过。后来,它扩展到可以支持Windows、macOS和Linux上的API子集,但不支持Windows特有的注册表等东西。在这一点上,API的覆盖范围似乎已经进一步扩大了,所以它几乎就像.NET Framework的翻版,尽可能完整地支持多个平台,同时避免支持微软似乎不再需要的API(如.NET Remoting)。像Windows Forms和WPF这样的UI API也不受支持(微软已经宣布下一个版本的.NET Core将支持桌面应用程序编程,包括Windows Forms和WPF,但这只适用于Windows上运行应用程序)。

由于.NET Core似乎是跨平台.NET的未来,如果你正在开发在Windows、MacOS或Linux上运行的应用程序,而且不是非Web界面(Windows Forms和WPF不可用),那么我建议使用.NET Core。它可能没有.NET Framework那么多的API,但如果你从头开始开发应用程序,则可以考虑使用这种占用较小空间的API。但是,如果你想让现有的.NET Framework支持跨平台,迁移到.NET Core可能会是一个沉重的负担,因为它可能不支持一些关键API。请注意,微软试图通过Windows兼容包等产品来缓解这种情况,Windows兼容包为.NET Core中的Windows特定API提供支持。但是,如果你使用了这些API,则仍然被锁定在Windows中,至少在.NET Core提供这些API之前是这样的,或者可以通过重写代码移除对它们的依赖。

.NET Standard

.NET Standard是另一个支持跨平台的.NET变种。与.NET Framework、Mono和.NET Core不同,它不是一个包含运行时和库的完整软件包。相反,它是一个API规范,.NET的实现需要基于这一规范——特别是.NET Framework、.NET Core和Xamarin(微软支持的面向iOS、Android和macOS的Mono分支)。目的是让基于.NET Standard实现的库可以在任意.NET平台应用程序中运行。.NET Standard仅支持库,而不是应用程序,所以可以用它开发可在任何地方运行的库。

最新版本的.NET Standard 2.0覆盖了更广的API,但仍有大量缺失。它几乎涵盖了.NET Core,但缺失了相当数量的.NET Framework API。当然,你没有理由非要使用那些缺少的API,但如果你选择了.NET Framework,而不是.NET Standard,那么在移除那些API依赖之前,你会锁定在.NET Framework上。

如果你正在开发一组新库,我会建议你选择.NET Standard。这样,你的库就可以运行在.NET Framework、.NET Core或Xamarin上,而不需要做额外的工作。当然,你一定会创建针对特定.NET变体的应用程序,但如果应用程序足够小,而且包含.NET Standard不支持的GUI类,并且将大部分功能都放在共享库中,那么应该能够最大程度地获得跨平台好处。由于缺乏某些API,迁移现有的.NET Framework代码可能会涉及更多工作,但即使是这样,仍然可以将尽可能多的代码迁移到.NET Standard库,并隔离平台特定代码。在跨平台场景中可能会用到你的.NET Standard库,并且随着时间的推移,你可以花费额外的精力将其余代码迁移到.NET Standard。

关于工具的简要说明

一直以来,每个.NET变体都有自己的专用开发工具。Visual Studio用于.NET Framework开发,MonoDevelop用于Mono开发,Visual Studio Code主要用于.NET Core开发。到了最近,这些界限开始渐渐模糊。除.NET Framework之外,现在可以使用Visual Studio开发Xamarin、.NET Core和.NET Standard。Visual Studio Code最初是一个源代码编辑器,但现在已经成为一个更加完整的开发环境,可用于开发.NET Framework或.NET Core。Xamarin Studio(基于MonoDevelop)已被Windows(他们推荐使用Visual Studio)弃用,现在变成Visual Studio for Mac,可用于开发Xamarin或.NET Core。因此,除非你正在开发.NET Framework(在这种情况下应该使用Visual Studio),否则可以根据其他需求选择合适的环境。

结论

.NET“大爆炸”产生了很多.NET变体,其中一些已经消亡,其他一些则占据了非常狭小的市场空间,另一些正在蓬勃发展。蓬勃发展的.NET变种之间的相似性足以让开发者感到困惑,并且不确定要使用哪一个,但其实在它们之间做出选择很简单。如果你要创建一个只能在Windows上运行的应用程序,请使用原始的.NET Framework。如果你希望应用程序能够在多个平台上运行,并且需要接近完整的.NET Framework API,请使用Mono。如果将现有的.NET Framework应用程序迁移到Windows以外的其他平台,Mono也是一个很好的选择。如果你创建的跨平台应用程序可以使用.NET Core提供的不完整API,那么可以考虑.NET Core。最后,可以考虑使用.NET Standard创建可在.NET Framework、.NET Core或Xamarin上运行的库,并在面向特定平台的组件中隔离面向特定平台的部分,例如用户界面。

关于作者

640?wx_fmt=jpegDr. Wayne Citrin 博士是JNBridge有限责任公司的首席技术官兼联合创始人,JNBridge有限责任公司是领先的Java和.NET互操作工具供应商。他是屡获殊荣的桥接技术JNBridgePro和适用于.NET和BizTalk的JMS Adapters架构师,Citrin自.NET推出测试版本以来一直在解决Java和.NET的互操作性问题。Citrin曾担任编程语言和编译器方面的研究员,并在科罗拉多大学博尔德分校担任计算机工程系教授。

原文地址: http://www.infoq.com/cn/articles/varieties-dotnet


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最短路】【Floyed】医院设置(ssl 1614)

医院设置 ssl 1614 题目大意: 有n个点,在一个点上安医院,使这个点到其他点的最短路之和最小 原题: Description 设有一棵二叉树(如右图)。其中,圈中的数字表示结点中居民的人口。圈边上数…

拓展 NLog 优雅的输送日志到 Logstash

在上上篇博客通过对aspnetcore启动前配置做了一些更改,以及对nlog进行了自定义字段,可以把请求记录输送到mysql,正式情况可能不会这么部署。因为近期也在学习elk,所以就打算做一个实例,结合nlog把日志输送到logstash&a…

曼哈顿距离与切比雪夫距离的转化及prufer序列

目录 曼哈顿距离与切比雪夫距离的相互转化prufer序列 1. 曼哈顿距离 与 切比雪夫距离 的相互转化 曼哈顿距离 |x1−x2||y1−y2|max(x1−x2y1−y2,x1−x2−y1y2,−x1x2y1−y2,−x1x2−y1y2)|x1−x2||y1−y2|max(x1−x2y1−y2,x1−x2−y1y2,−x1x2y1−y2,−x1x2−y1y2)|x_1 - x…

[译]如何在.NET Core中使用System.Drawing?

你大概知道System.Drawing,它是一个执行图形相关任务的流行的API,同时它也不属于.NET Core的一部分。最初是把.NET Core作为云端框架设计的,它不包含非云端相关API。另一方面,.NET Core是跨平台框架,它不包含任何操作系…

关于Visual Studio 2019的前期详情

近日,来自微软公司的 John Montgomery 正式宣布,Visual Studio 2019已进入开发阶段。Montgomery 表示,之所以选择在这个时间点公开这个消息,是因为微软准备在 GitHub 上公开可见的项目(包括 .NET 和 Roslyn&#xff09…

开源的,跨平台的.NET机器学习框架ML.NET

微软在Build 2018大会上推出的一款面向.NET开发人员的开源,跨平台机器学习框架ML.NET。 ML.NET将允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无需事先掌握开发或调整机器学习模型的专业知识。在采用通用机器学…

虚树-树上动态规划的利器

虚树 问题引入 在一类树上动态规划问题中,题目给出的询问往往包含树上的很多各节点,并保证总的点数规模小于某个值. 如果我们直接在整颗树上进行dpdp的话,时间复杂度与询问的次数有关,这显然是不可接受的,如果我们可以找到一种动态规划的方法,使其时间复杂度与询问中点的实际…

微软推出Visual Studio Kubernetes工具包预览版

微软表示,利用 Visual Studio Kubernetes 这个工具,使用者可以直接在该环境中,构建 Kubernetes 容器应用程序项目,或者让现有的 .NET 网页应用程序也兼容 Kubernetes。除了公有云基础架构环境要支持 Kubernetes,微软现…

基于docker 如何部署surging分布式微服务引擎

1、前言转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微服务引擎,再把业务进行剥离, 通过配置路径就能驱…

DevOps 实践:千里之行

在上一篇 DevOps 渊源:角色消融 中我们分析了在作坊式团队中的责任重叠,也回顾了 DBA 角色的消融。那么,如今我们讲的 DevOps 又是什么角色的消融呢? 我想你已经猜到了,接下来要消融的角色就是运维人员了。那这次又是什…

约数个数

约数个数 题目大意: 求a到b之间每个数的约数的个数之和 原题: 题目描述 定义f(x)为x的约数个数,x为正整数。 f(a)f(a1)……f(b),即a,b之间每个数的约数的总和。 输入 一行两个正整数a、b,以一个空格隔开。 输出…

asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...

最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionless的学习做下笔记!Exceptionless是什么?能做什么呢?“Exceptionless”这…

使用 IIS 在 Windows 上托管 ASP.NET Core2.0

准备:操作系统:Windows Server 2008 R2 或更高版本开发环境:VS2017回到顶部第一步:新建项目ASP.NET Core Web应用程序在 Visual Studio 中,选择“文件”>“新建”>“项目”。在新建项目对话框的左侧窗格选择“.N…

数学推导题,NTT,快速数论变换,Wannafly-导数卷积

导数卷积 题目描述 题解 参考了一下标程的推导过程,因为这个推导对我这种数学弱渣真的有点难鸭. [1]f(x)f(x)f(x)的iii次导函数: f(i)(x)ai∗i!0!ai1∗(i1)!1!∗x1...an−1∗(n−1)!(n−1−i)!∗xn−1−if^{(i)}(x) a_{i}*\frac{i!}{0!} a_{i1}*\frac{(i1)!}{1!}*x^{1} ...…

使用 C# 代码实现拓扑排序

0.参考资料尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用。https://www.codeproject.com/Articles/869059/Topological-sorting-in-Csharphttps://songlee24.github.io/2015/05/07/topological-sorting/https://www.cnblogs.com/skywang1…

ASP.NET Core 2.1带来SignalR、Razor类库

随着.NET Core 2.1的发布,微软推出了 ASP.NET Core 2.1。这是一个强大的版本,包括实时通信库SignalR,更新的模板使GDPR更容易遵守,并且针对Angular、React,以及React Redux更新了SPA模板。在2013年发布传统的ASP.NET时…

针对ASP.NET Core Web API的先进架构

.NET Core 最初是在2016年发布的,随着.NET Core 2.0的发布,微软拥有了下一个通用、模块化、跨平台和开源的平台主版本。.NET Core已经创建了许多API,在当前版本的.net框架中均可用。它最初是为下一代ASP.NET解决方案而创建的,但现…

ASP.NET Core 2.1 使用Docker运行

1.新建一个 ASP.NET Core 2.1 项目然后运行一下项目,确保我们刚刚建立的项目可以正常运行。2.编写 Dockerfile新建一个文本文件,命名为 DockerfileFROM microsoft/dotnet:2.1-aspnetcore-runtimeWORKDIR /appCOPY . .EXPOSE 80ENTRYPOINT ["dotnet&…

【DP】和谐的奶牛(jzoj 1750)

和谐的奶牛 题目大意: 有一些括号(保证是合法的,合法:每一个左括号都有自己配对的有括号),现在要将这些括号分为两组(其中一组可以为空),分完组后括号的顺序要和原来的…

费用流-Wannafly Day2 TwoGraph-神题

TwoGraph 题意 题解 这真是一道神题,这题有两点比较难想,其中第一点是最难想的. 我们先考虑只有一张图的情况. 性质: [1]如果给每个点匹配一条边,形成一个(点,边)(点,边)(点,边)对,其中点不能重复出现,边也不能重复出现.那么这些对形成的图的联通块要么是树,要么是环套树. 证…