上一篇文章介绍了.NET的发展简史,今天我们来看看.NET相关延申。
.NET 是一个由 Microsoft 设计和支持的软件开发框架和生态系统,可实现轻便的桌面和 Web 应用程序工程。它是一个流行的免费平台,目前用于许多不同类型的应用程序,因为它为大多数软件开发阶段提供了编程环境。.NET 最适合寻求广泛功能的企业,例如基于 Web 的服务、桌面软件和云基础架构支持。
.NET 背后的历史:从 .NET Framework 首次发佈到 .NET 6
微软在 90 年代后期开始研究 .NET 框架。这个想法是基于所谓的托管代码创建一个平台,这些代码可以在运行时环境下执行。这是改善开发体验并使工程师免于处理安全操作、主动内存管理和其他 C/C 开发人员不得不费心的低级工作所必需的。
.NET 框架时代
2002 年 .NET Framework 的第一个版本引入了 C#,这是一种用于编写託管代码的语言,其设计类似于 C 。该框架本身针对基于 Windows 的计算机和服务器。它有 WinForms,一个用于桌面应用程序的 GUI 库;ASP.NET,一个Web框架;和 Web Page is Unavailable 用于数据访问。所有这些元素都由公共语言运行时 (CLR) 驱动以编译和执行托管代码。
为了统一各种功能,.NET 提供了一个框架类库 (FCL),其中包括基类库 (BCL)、网络库、数字库等。
从那时起,该框架经历了多次迭代,包括运行时更新、新的桌面图形系统 (WPF)、面向服务的应用程序 (WCF) 的API等等。
2014 年,微软通过推出 .NET Core,一个新的跨平台、云友好和开源版本的框架,宣布了 .NET 存在方式的巨大转变。.NET Core 于 2016 年发布,成为新 .NET 项目要考虑的主要技术。渐渐地,Microsoft 开始移植现有服务以与 Core 一起使用。一些没有收到官方端口的,如 Windows Communication Foundation (WCF),被来自社区的替代品所取代。
2016 年之前的 .NET 生态系统
此外,微软在 2016 年收购了 Xamarin,该技术以前是跨平台移动开发的专有技术,也使其开源。
微软继续朝着“产品团队和社区之间的透明度”迈进,并于 2018 年 12 月开源了 Windows Presentation Foundation (WPF)、Windows Forms 和 WinUI 框架。
.NET 5 和 .NET 6 时代
2019 年 5 月,该公司宣布了将生态系统联繫在一起的重大版本:所有 .NET 元素都应该捆绑在 .NET 5 开发平台中。尽管由于 COVID-19 对日程安排进行了更改,但 .NET 5 统一开发平台最终于 2020 年 11 月推出。.NET Core 3.1 和 .NET Framework 4.8 的继任者 .NET 5 整理了碎片化的.NET 世界,并提供了许多功能来在 Windows、Linux、macOS、iOS、watchOS、Android、tvOS 或使用 WebAssembly 上构建应用程序。该平台带有新的 API、语言功能和运行时功能。此外,.NET 5 包括 ASP.NET Core、Xamarin、Entity Framework Core、WPF、WinForms 和 ML.NET。
.NET 5 的发布是如何组织 .NET 平台的。
虽然 .NET 5 奠定了统一基础,但最新的 .NET 6版本于 2021 年 11 月交付了它的最终部分,Visual Studio 2022 也在同一天发布。这是一个用于跨云、浏览器、物联网、移动和桌面环境构建项目的统一平台,使所有人都能够使用相同的 .NET 库、SDK 和运行时。
.NET 6 统一开发平台。
.NET 6 最突出的功能之一是 .NET MAUI(多平台应用程序 UI),它充当跨平台框架,用于使用 C# 和 XAML 开发本机桌面和移动应用程序。
除了作为统一的最后一步之外,.NET 6 还可以夸耀:
- 通过减少项目执行时间、延迟时间和内存使用来提高性能。
- 用于 HTTP/3、JSON 处理、数学和直接内存操作的 API。
- 通过支持OpenSSL 3和ChaCha20Poly1305 加密方案提高了安全性。
- 稳定版,长期支持3年。
表格显示了 .NET Core 版本和支持。
除此之外,它还是第一个原生支持 Apple Silicon (mac OS Arm64) 并改进了对 Windows Arm64 支持的版本。
什么是.NET开发平台
.NET 有四种风格:.NET Framework、.NET Core、Xamarin 和通用 Windows 平台 (UWP)。
这些实现组合起来称为 .NET 开发平台。它们中的每一个都包含用于构建各种应用程序的框架和库。
.NET 框架
2002 年发布的 .NET Framework 是该平台的第一个也是最古老的实现。它包括三个主要的应用程序模型——WPF、Windows 窗体、ASP.NET 窗体——和基类库。
Windows Presentation Foundation (WPF)是一个 UI 框架,主要用于为 Windows 操作系统上的桌面客户端应用程序创建图形界面。WPF 使用可扩展应用程序标记语言 ( XAML ) 的功能。
Windows 窗体是 .NET Framework 中的一个 GUI 类库。Windows 窗体用于开发具有易于更新和部署的丰富图形的桌面应用程序。
ASP.NET。虽然前两个组件是为桌面工程设计的,但 ASP.NET 用于开发动态网站和 Web 应用程序。其核心是公共语言运行时 (CLR),它使开发人员有机会使用我们在下面讨论的不同.NET 语言编写 ASP.NET 代码。
基类库 (BCL)提供最常见的功能,如命名空间中的类,并且是框架类库 (FCL)的核心,这是一组与公共语言运行时 (CLR)紧密集成的可重用接口、类和值类型) 。FCL 和 CLR 的组合构成了 .NET Framework。基类库还包括 Web Page is Unavailable,这是开发人员用来访问数据库的数据访问技术。
由于 .NET Framework 仅支持基于 Windows 的设备,因此需要一个跨平台的包。
.NET 核心
.NET Core 于 2016 年发布。它是 .NET Framework 的跨平台重新构建。与旧版本不同的是,工程师现在可以在 Linux 和 macOS 上使用该产品,并创建不一定绑定到 Windows 系列的应用程序。新系统旨在征服云空间,因为像 Digital Ocean 这样的一些提供商是 Linux 驱动的。.NET Core 不仅是跨平台的,而且它的不同版本也可以并排安装在同一台设备上。.NET Core 包括 ASP.NET Core 和通用 Windows 平台 (UWP)。
ASP.NET Core是ASP.NET的重建,碰巧是一个比其前身更加模块化的框架。ASP.NET Core 允许您构建移动后端、Web 应用程序和服务。它也是跨平台的,可以在 OS X、Windows 和 Linux 上运行。
在 .NET 6 中,ASP.NET Core 计算了许多新功能,包括热重载,它允许应用程序更改 C#、Visual Basic 和 CSS 源文件,而无需重新启动或重建应用程序(应用程序正在运行,而您正在更新代码)。
沙马林
第三种实现称为 Xamarin,用于移动应用程序和 Mac 产品。最初,Xamarin 是独立于 Microsoft 设计的,是一种专有产品。然后微软在 2016 年收购了它,使其成为 .NET 平台的一个完全开源的分支。Xamarin 使用 Mono 运行时和经过调整的 .NET Framework 版本,以便与适用于 iOS、Android 和 Xamarin.Mac 的 API 一起使用。要详细了解该产品,请查看我们的Xamarin 优缺点文章。
所有运行时都使用一个共同的基础设施,使整个生态系统工作。它提供运行时组件、语言和编译器。
通用 Windows 平台 (UWP)
UWP 为在 Windows 10 上运行的所有设备提供通用类型系统、API 和应用程序模型。因此,UWP 支持为 PC、平板电脑、Xbox、Surface Hub、HoloLens或物联网 (IoT) 设备开发通用应用程序。
UWP 应用程序开发人员可以访问 Microsoft 商店,与 Google Play 商店和 App Store 不同,基于非游戏订阅的应用程序仅收取 15% 的费用。其他服务包括执行环境 (AppContainer) 和扩展 SDK,用于为不同设备调用专用 API。
不幸的是,.NET 5 和 .NET 6 将不会出现在 UWP 项目类型中,并且在这方面不会有关于 UWP 的更新。
.NET 标准
2016 年,微软还推出了.NET Standard,这是一个结合了 .NET Framework、.NET Core 和 Xamarin 的 API 的库,允许工程师使用单个基类库,而不是掌握与每个 .NET 实现相关的三个不同的库。这一步统一了生态系统,为跨平台复用组件带来了更高的一致性。
2016 年后的 .NET 生态系统
.NET 开发平台最好与 Visual Studio IDE 一起使用,用于跨所有平台和设备构建、调试和发布应用程序。
公共语言运行时 (CLR)
公共语言运行时 (CLR) 是 .NET 的核心,它是管理内存、实现代码访问安全、验证代码安全并提供线程和代码执行的应用程序虚拟机。CLR 使 .NET 代码成为託管代码。
正如我们提到的,CLR 的想法是让开发人员的生活更轻鬆。此外,它允许工程师使用多种语言设计系统,因为 CLR 使他们能够交流和集成他们的行为。运行时会检查应用服务的所需版本,以确保所有依赖项都完好无损并且代码按预期工作。
在 .NET Core 中,使用开源 CoreCLR。虽然与 .NET Framework 中的 CLR 几乎相同,但 CoreCLR 已针对 .NET Core 跨平台构成进行了调整。
支持的语言
您可以在 .NET 中使用的语言最终可以分为两大类:1) Microsoft 官方支持的主要语言,以及 2) 其他符合 CLI 的语言。
主要语言。大多数 .NET 开发都是使用C#、F#和Visual Basic 进行的。所有三个都在 .NET 6 版本中看到了很大的改进。引入了 C# 10 和 F# 6,旨在简化代码并提高其性能。
其馀的 CLI 兼容语言。CLI 是指公共语言基础设施。它是一种高级语言的技术标准,可以编译成通用中间语言(CIL)并进一步编译成字节码。除了上面提到的三个之外,还有大约 25 种活跃的 CLI 兼容语言,包括 C /CLI、IronPython、Oxygene、Phalanger 等。还有许多不再使用的语言,例如 IronRuby。
.NET 开发的优点
面向对象的软件开发模型
.NET 基于面向对象编程 (OOP)。OOP 是一种将软件分解为更易于管理和组合的更小的部分的开发模型。OOP 将数据划分为对象,即数据字段,并通过类的声明来描述对象的行为和内容。
模块化结构有助于定义对象的行为及其交互,而无需管理对象内部属性。OOP 通过使代码易于管理、更易于测试和响应重複出现的问题来简化编程。它还消除了不必要的编程,通常意味著开发人员的编码更少。.NET 使重用代码和组件成为可能,节省时间,以及随后的开发成本。
可靠且简单的缓存系统
缓存意味著将数据保存在临时存储位置,以便在需要时更快地调用它。存储的数据是较早的信息请求的结果,或者是存储在其他地方的信息的副本,这些信息需要更长的时间来检索。
.NET 中的缓存系统健壮且易于使用。它还被设计为可扩展的。对象缓存类允许开发人员创建自定义缓存实现,用于提高 Windows 客户端和服务器应用程序的性能和可伸缩性。
视觉工作室IDE
集成开发环境 (IDE) 是面向程序员的单一产品,它通过提供编写和测试软件所需的所有工具来简化应用程序开发。
Visual Studio 是一个 Microsoft IDE,用于跨所有平台(包括 Android 和 iOS)构建、调试和发布应用程序。Visual Studio 与 .NET 集成并提供特定语言环境的功能。
Visual Studio IDE 的主要功能:
- 它用作所有 .NET 应用程序的单个 IDE。
- IDE 集成了编译和调试功能。
- 协作功能包括 Git 优先工作流、同一代码库上的实时协作以及集成的代码审查。
- 该解决方案可用于基于不同语言编写的代码的应用程序。
- Visual Studio 允许自定义环境以匹配用户首选项。
此外,Visual Studio Marketplace提供来自 Microsoft 和其他供应商的各种编辑器扩展,以实现团队协作、持续集成、第三方连接、云开发管理等。
通用 IDE Visual Studio 2022 于2021 年 11 月与 .NET 6 一起发布。推出的是 IDE 本身的第一个 64 位版本,并且充满了有用的功能。其中,Visual Studio 2022 包含 IntelliCode — 使用机器学习为您完成代码块、识别重複编辑和提出修复建议的特殊功能。
.NET Core 的跨平台设计
.NET Core 是一种跨平台的 .NET 实现,允许代码在 macOS、Windows 和 Linux 上运行。与未完全开放的原始 .NET 框架不同,.NET Core 拥有完全开放的源代码,可确保广泛的工程社区能够持续为其开发做出贡献。
如果您使用 C#、F# 或 Visual Basic 编写代码,您的代码将在每个兼容的操作系统上运行。这使公司能够接触到 .NET 生态系统中最广泛的平台。同时,跨平台设计确保拥有大量不同工程技能的整个 .NET 社区共享经验。
部署灵活,维护方便
.NET Core 的重要功能之一是灵活部署。它可以作为应用程序的一部分安装或需要单独安装。模块化设计考虑包括您需要的所有依赖项。部署本身就像複制文件夹一样简单。
另一个好处是,您可以在同一台机器上并行运行多个 .NET Core 版本,以覆盖不同的项目并无缝执行部署任务。
通用 .NET 标准
自 2016 年以来,.NET 生态系统已通过名为 .NET Standard 的大型类库得到增强。它基于 .NET Framework、.NET Core 和 Xamarin 的基类库的数量。它们用于处理常见功能,例如图形渲染、数据库交互和 XML 文档操作。.NET Standard 库极大地简化了开发人员的工作。
在 .NET Standard 之前,程序员必须为新平台重新开发应用程序或库,然后在各种平台上分发所有更新。目前,该库支持跨应用程序的所有依赖库。但是,您应该检查版本兼容性以成功利用 .NET Standard。
.NET 流行度和社区
对于那些想知道 .NET 有多受欢迎的人来说,庞大的开发人员社区就是答案。有趣的是,它联合了来自小型、中型和企业级公司的工程师。这意味著几乎任何问题都可以在社区成员的帮助下解决。
由于 .NET Core 是开源的,它的库、运行时和编译器都可以在 GitHub 上找到并且有很多贡献。根据Stack Overflow 2021 调查,ASP.NET 在最受欢迎的 Web 框架中排名第五。
专业开发人员认为最流行的 Web 框架。 资料来源:2021 年堆栈溢出调查
同时,.NET Framework 与 .NET 5 和 .NET Core 分别位列第一和第二,成为除 Web 开发之外最常用的框架。
.NET Framework、.NET Core 和 .NET 5 在“其他技术”类别中处于领先地位。资料来源:2021 年堆栈溢出调查
除此之外,.NET Foundation 还围绕 .NET 生态系统促进开放式开发和团队合作。.NET 社区和商业开发人员将其用作思想交流的主要论坛。
ASP.NET 中的自动监控
ASP.NET 具有内置的自动监控功能。Windows Web Server 严格监控在其上运行的网页和应用程序。如果发生内存洩漏或无限循环等任何问题,它会立即发出警报。这允许直接纠正这些行为并创建新流程。监控确保.NET 应用程序具有更高的稳定性和透明度。
强大的 Roslyn 和 RyuJIT 编译器
.NET 使用两个编译器Roslyn将 C# 或 VB 代码编译为 CIL(通用中间语言),以及RyuJIT将 CIL 实时编译为本机代码。这两种编译器都受到 .NET 社区的高度评价,因为 Microsoft 积极改进它们。
Roslyn 自 2011 年开始可用。 2014 年,它成为开源软件,并于 2015 年被包含在 Visual Studio 中。除了它是开源的这一事实之外,Roslyn 还公开了 API,以便为开发人员提供丰富的代码分析。这意味著,与传统的黑盒编译不同,使用 Roslyn,开发人员可以在每个阶段读取编译数据。
RyuJIT 负责将 CIL 编译为字节码。旧 JIT 的全面过渡于 2018 年完成,其想法是提高性能。而且,一般来说,工程师都同意 RyuJIT 更快。根据2020 年春季发布的.NET 5 Preview 1和Preview 2,对 RyuJIT 进行了大量改进,以提高 JIT 生成的机器代码的质量(微软专家称之为“代码质量”)。“总而言之,以下改进中约有一半是实际的新优化,另一半是由于改变了 RyuJIT 的流程,以使现有优化能够应用于更多代码模式, ”.NET 团队项目经理 Richard Lander 指出。
微软支持
由于 .NET 是 Microsoft 的平台技术,您希望该公司积极支持和开发它。但关键是,微软真的很擅长他们正在做的事情。也许没有其他技术公司拥有如此完整和连贯的生态系统,可以为工程师检查所有框,从 IDE 和框架到云服务。
微软尽最大努力进一步发展。向 .NET Core 的过渡是生态系统发展的重要一步,因为它採用了云计算并专注于性能改进。
2018 年,微软为 C# 和 F# 语言推出了ML.NET框架。此外,让我们记住 .NET 5 和 .NET 6 的版本已经发布,.NET 7 预计将于 2022 年发布。
从 .NET 5 到 .NET 6 的迁移相对容易
如果您的应用程序始终使用最新的 .NET 版本进行更新,那麽从 .NET 5.0 迁移到 .NET 6.0 将不是一件大麻烦事。您首先在 Visual Studio 2022 中项目的属性上将目标框架从 .NET 5.0 更改为 .NET 6.0。然后升级项目中的其馀包并运行 QA 流程以查看所有内容的执行情况。
与上述不同,从 .NET Framework 到 .NET Core 或某些 .NET Core 版本之间的迁移并不是在公园裡散步。如果您的项目基于 .NET Core 3.1 等早期版本,建议在迁移到最新版本之前将应用程序迁移到 .NET 5。
.NET 开发的缺点
儘管 .NET 由于广泛的基础设施和经过验证的产品开发历史而被认为是最强大的工程平台之一,但它也存在一系列问题。
有限的对象关係支持
正如我们上面提到的,.NET 使用面向对象编程 (OOP) 语言模型。这个模型以对象而不是“动作”和数据而不是逻辑为中心。.NET Framework 和 Core 中面向数据的软件应用程序开发的支持由Entity Framework 提供。
Entity 是一个对象关係映射器 ( ORM ),用于链接面向对象的 .NET Framework 和关係 (SQL) 数据库。一些工程师认为实体框架不够灵活,可能不支持所有可用的数据库设计。这也意味著在某些时候实体框架可能不支持新的数据库设计。另一个问题是该框架最终可能会被微软抛弃。
从好的方面来说,您始终可以选择另一个 ORM 替代方案,因此它仍然是一个有争议的问题。
许可费用
无论採用何种开源技术,构建 .NET 应用程序的成本都不低。大多数情况下,您的费用将用于 Visual Studio IDE 和 Microsoft 为简化您的工作而提供的其他额外协作和质量保证服务。截至今天,Visual Studio中的商业版本将花费你$ 45 /月为每一位用户。包含各种云、企业移动性、QA 功能等的企业版本将为每位用户每月 250 美元。但是,您仍然可以尝试成为Microsoft 合作伙伴以免费获得大量订阅。出于非营利和教育目的,还有免费的Visual Studio Community .
儘管您可以在 Mac 和 Linux 机器上使用 .NET Core,但最好的方法是使用 Windows 进行 .NET 工程,这也需要许可成本。
如果您以前从未使用过 Microsoft 产品并且必须从 AWS 云生态系统迁移到 Azure,那麽障碍会更高。
发布与稳定之间的差距
也许,这个问题会削弱所有 Microsoft 产品,而不仅仅是 .NET 堆栈。但绝对值得一提。新发布的产品缺乏适当的文档、支持、稳定性,并且容易发生剧烈变化。在AltexSoft 的一个项目中,我们的架构师决定使用全新的 DocumentDB(现在是Azure Cosmos DB),但随后被迫设计自定义数据架构,因为该产品遇到了许多可能危及整个项目的技术问题。
Y Combinator 的一位用户生动地描述了这个问题:“我对这些微软技术佈道文章/视频的问题是,微软似乎总是在工作,并告诉全世界它很棒,而且准备生产。然后你去实现它,一旦你离开他们演示的完美世界,它就会分崩离析,然后你发现文档是为测试版编写的,不再适用,所以你只能猜测在您需要的方法的正确调用签名处。”
与此同时,微软一直在努力解决这个问题,该公司最新的长期支持 (LTS) .NET 6 版本声称拥有 3 年的官方支持和适当的使用和迁移文档。
内存洩漏
内存洩漏问题在任何技术中并不少见。简单地说,框架不会释放它不再需要的内存。.NET 经常因内存洩漏和内存相关问题而受到批评。儘管 .NET 有针对此类问题的垃圾收集器,但工程师仍然需要在适当的资源管理上投入更多精力。随著应用程序的扩展,洩漏不断增加。
幸运的是,工程师可以找到详细有效的建议来检测 .NET 中的洩漏。
向 .NET Core 的颠簸过渡
.NET Core 是微软平台开发的下一个重要步骤。与往常一样,过渡期可能漫长而艰难。使用旧的 .NET Framework 构建的应用程序数量超过使用 .NET Core 构建的应用程序。这并不一定意味著他们所有人都会经历这种转变。在企业环境中,可能不会优先考虑过渡。儘管如此,这些系统需要支持。
这裡的另一个相关问题是成熟的 .NET Framework 有许多支持项目。例如,许多开发人员表示担心放弃Windows Communication Foundation (WCF),这是许多 .NET 从业者使用的面向服务的应用程序的运行时和 API 集。微软决定不将 WCF 移植到 Core。相反,他们利用社区的努力,因为 .NET 基金会团队成员之一捐赠了开源替代品Core WCF。同样,这不是由 Microsoft 直接管理,也不提供与原始 WCF 的完全兼容性。开发人员将不得不花费一些额外的努力来完成转换。
来自 .NET 程序管理的 Scott Hunter发帖称,您不会在 .NET Core 中找到 ASP.NET Web Forms、.NET Remoting 和其他一些服务。它们将永远消失,为新技术开闢道路。
如何时使用 .NET
可扩展的产品。通常,业务需求不断增长,您的软件必须随之扩展。.NET 提供了一个可扩展的环境,并允许重新设计正在进行的应用程序,以满足不断增长的业务需求。
跨平台需求。如果您需要跨平台运行的应用程序,.NET 将是一个很好的选择,因为涵盖了大多数平台,您可以减少开发工作,同时将桌面或移动应用程序扩展到其他操作系统。此外,.NET 还可用于游戏(包括 Xbox)和 AR 开发(包括 HoloLens)等特定工程案例。
企业规模的基础设施。.NET 是否主要为企业使用而设计仍然是一个有争议的问题。但微软确保它提供尽可能广泛的工具集来构建和交叉集成企业产品,包括内部和公共产品。它还支持强大的企业移动生态系统。
本文系外文翻译:https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-net-framework-programming/