Web开发

首页 » 常识 » 预防 » 构建不同NETFramework版本的
TUhjnbcbe - 2022/8/26 19:15:00

作为.NET开发人员,我们习惯于在我们的计算机上运行最新版本的操作系统并安装最新的更新。但是,在IT人员通常更为保守的企业环境中并非总是如此。在进行任何大规模更新之前,他们会确保所有关键业务软件在没有问题的情况下继续运行。

因此,我们编写的软件无法始终利用最新的.NET框架功能。

您是否跟上新的开发人员技术?通过我们的免费开发人员杂志推进您的IT职业生涯,涵盖C#,模式,.NET核心,MVC,Azure,Angular,React等。免费订阅DotNetCurry(DNC)杂志并下载所有以前,当前和即将推出的版本。

在本文中,我们将了解.NET框架版本之间的主要差异,并探索即使使用最新的开发工具,我们仍然可以定位旧版本的.NET框架。

编者注:如果您希望创建支持Windows,macOS和Linux的跨平台应用程序,并且可以在Web,移动,云和嵌入式/物联网方案中使用,请务必阅读.NET开发人员的新功能和.NET的未来。

.NETFramework的演变

在撰写本文时,自.NETframework1.0最初发布以来已经过去了十五年,并且今天看到它,它似乎远没有它那时那么令人印象深刻。我们随便习惯的大多数功能都没有,那么如果我们想用它来开发现代应用程序,我们就会很难。

以下是每个.NET版本中主要功能的快速概述。

表1:.NET框架版本历史记录

.NETframework1.0包含一组非常有限的应用程序框架。仅支持以下类型的应用程序:

用于桌面的控制台和Windows窗体应用程序,Windows服务,基于ASP.NETWebForms的Web应用程序和使用SOAP协议的Web服务。

.NETframework1.1没有添加太多内容。虽然它具有较新版本的CLR(公共语言运行时),但主要是为了在同一台计算机上并行安装两个版本。

最值得注意的新功能是支持IPv6,ASP.NETWeb窗体的移动控件和ODBC的开箱即用的ADO.NET数据提供程序。除非您特别需要其中一个功能,否则没有特别令人信服的理由迁移到v1.1。

.NETframework2.0完全是一个不同的故事。它建立在前两个版本公认的弱点之上,并引入了许多新功能以提高开发人员的工作效率。我们只列出影响最大的那些:

泛型的引入允许创建模板化数据结构,该数据结构可以与任何数据类型一起使用,同时仍然保持完整类型安全性。泛型广泛用于集合类,例如列表,堆栈,字典等。在泛型之前,只有对象可以存储在提供的集合类中。与其他数据类型一起使用时,代码必须在从集合中检索对象后将对象强制转换回正确的类型。或者,必须为每种数据类型派生自定义集合类。然而,泛型并不仅限于收藏品。例如,可空值的类型也依赖于它们。改进的调试允许编辑和继续功能:当在调试器中暂停正在运行的应用程序时,可以动态修改代码并使用修改后的代码继续执行。对于习惯于在开发环境中使用等效功能的现有VisualBasic6程序员来说,这是一个非常重要的功能。添加了64位运行时。当时,只有WindowsServer具有64位版本,该功能主要针对具有高内存要求的服务器应用程序。今天,大多数Windows安装都是64位,许多.NET应用程序以64位模式运行,我们甚至没有意识到这一点。

所有这些,以及对运行时和类库的无数其他较小的改进使.NETFramework2.0对于当时使用其他开发工具的Windows开发人员更具吸引力。这足以使.NET框架成为Windows开发的事实标准。

.NETframework3.0是.NET框架的第一个版本,它无法与以前的版本并排安装,因为它仍然使用相同的运行时(CLR2.0)。它只添加了新的应用程序框架:

WindowsPresentationFoundation(WPF)是用于桌面应用程序开发的Windows窗体的替代方案。改进的绑定可以实现更好的架构模式,例如MVVC。通过广泛的主题支持,应用程序开发人员最终可以超越经典战舰-他们的应用程序的外观。WindowsCommunicationFoundation(WCF)是一种新的灵活编程模型,用于开发符合SOAP的Web服务。其配置选项使得可以将Web服务实现与所使用的传输完全分离。它仍然在任何平台上都具有最完整的WS-*标准实现,但随着SOAPWeb服务的衰落而转向REST服务,它正在失去其重要性。WindowsWorkflowFoundation(WF)是一种用于长期运行的业务流程的新编程模型。可以使用图形设计器通过将现有代码块组合成描述其基于运行时条件的执行顺序的图来定义业务逻辑。

虽然WF没有被广泛使用,但我们很难想象没有WCF和WPF及其衍生产品的.NET框架。

.NETframework3.5延续了保持相同运行时和扩展类库的趋势。

最值得注意的是语言集成查询(LINQ)。这是一种更具声明性(或功能性)的操作集合的方法。它受到在关系数据库中广泛使用的SQL(结构化查询语言)的高度启发。因此,它提供了一种查询语法,作为更传统的流畅API的替代方案。

通过使用表达式树来表示查询结构,它为许多LINQ提供程序打开了大门,这些提供程序可以根据底层数据结构以不同方式执行这些查询。开箱即用的包括三家供应商:

LINQtoObjects用于对内存中集合执行操作。LINQtoXML用于查询XMLDOM(文档对象模型)。LINQtoSQL是一个简单的对象关系映射(ORM)框架,用于查询关系数据库。

与此版本的.NET框架相关的Web相关技术也开始发展:

ASP.NETAJAX库引入了部分更新基于Web窗体的页面的可能性,通过在页面中使用JavaScript代码检索更新,无需对服务器进行完全回调。这是我们今天所知的单页应用程序(SPA)的第一个小步骤。WF服务通过将WF与WCF集成,将WF应用程序公开为Web服务。通过其他算法扩展了对加密的管理支持:AES,SHA和椭圆曲线算法。

看一下.NETframework3.5SP1的名称,人们不会指望它包含功能,但至少有两个值得一提:

实体框架(EF)是一个功能齐全的ORM框架,可以快速取代LINQtoSQL。它也严重依赖LINQ进行查询。.NETClientProfile是.NET框架的替代重新分发软件包,仅包含客户端应用程序所需的部件。它被引入作为一种手段,以对抗不断增长的完整.NET框架的大小,并加快不需要运行服务器端应用程序的计算机上的安装过程。

.NETframework4是下一个包含新版CLR的框架,因此可以再次与先前版本并行安装。

注意:如前所述,您无法在计算机上并排运行版本2.0,3.0和3.5。为版本2.0,3.0和3.5构建的应用程序都可以在3.5版本上运行。从.NETFramework4开始,您可以在一个进程中使用进程内并行托管来运行多个版本的CLR。

最值得注意的新增内容包括:

动态语言运行时(DLR),改进了对后期绑定的支持。这简化了某些COM互操作方案,并使动态语言移植到CLR更容易。IronRuby和IronPython(.NET框架的Ruby和Python端口)利用了这一点。引入了可移植类库(PCL),用于创建可在不同运行时(不仅是.NET框架,还有WindowsPhone和Silverlight)上运行的二进制兼容程序集。基于任务的异步模式(TAP)是编写多线程和异步应用程序的新抽象,它隐藏了程序员的许多容易出错的细节。ASP.NETMVC是WebForms用于创建Web应用程序的另一种编程模型。顾名思义,它实现了模型视图控制器(MVC)模式,该模式在其他平台上越来越受欢迎。它首次在带外发布,但.NET框架4是第一个将其包含在开箱即用的版本。

.NETframework4.5是.NET框架的最新主要新版本,具有几个新的重要功能:

由于C#中的新异步和等待语法使得使用它们变得更加容易,因此添加了对异步I/O操作的支持。ASP.NETWebAPI和ASP.NETWebPages最初是在带外发布后首先包含在框架中。他们允许开发REST服务,并分别为ASP.NETMVC视图提供了另一种Razor语法。PCL已扩展为支持Windows8的Windows应用商店应用程序。

此外,.NET客户端配置文件已停止使用,因为对.NET框架的大小和部署过程的优化使其过时。

自.NETframework4.5以来,发布的节奏增加了。版本号(4.5.1,4.5.2,4.6,4.6.1,4.6.2,4.7,4.7.1,4.7.x)反映了这一点。每个新版本都带来了错误修复和一些新功能。自.NETframework4.5以来更重要的是:

编辑并继续支持64位应用程序。改进了异步代码的调试。统一不同的ASP.NETAPI(ASP.NETMVC,ASP.NETWebAPI和ASP.NETWeb页面)。支持HTTP/2。改进的64位即时(JIT)编译器,可以缩短较小应用程序的启动时间。

新开发的重点现在已转移到.NETCore,因此对.NET框架的新的重大改进不太可能。不过,我们可能仍然期望有一些错误修复和较小改进的小版本。

.NETFramework-向后兼容性

自最初发布以来,向后兼容性一直是.NET框架的重要组成部分。除了极少数例外,为旧版.NET框架构建的任何应用程序都应该在任何较新版本的.NET框架中运行,而不会出现任何问题。

我们可以将.NET框架版本分为两类:

第一类是.NET框架版本,其中包括新版本的CLR。在这些版本中引入了一些可能影响现有应用程序的重大更改。为了使所有应用程序都能正常工作,这些.NET框架版本并排安装,即它们保持先前版本的完整性,并允许为其构建的应用程序仍然使用它。发布了四个版本的CLR:1.0,1.1,2.0和4。第二类是没有新版CLR的.NET框架版本。这些只扩展了类库,即为要使用的应用程序添加新的API。它们就地安装并因此影响现有应用程序,迫使它们在更新的.NET框架版本上运行。

从Windows8开始,不再支持.NETframeworks1.0和1.1。操作系统预装了.NET框架的版本,该版本在发布时是最新的。较新版本作为WindowsUpdate的一部分安装。预安装的版本基于CLR4..NETframework3.5(在CLR2.0上运行的最新版本)可以选择作为Windows功能安装。

为.NETFramework4或更高版本构建的应用程序将在预安装的基于CLR4的.NET框架版本上运行。如果他们使用目标计算机上尚未安装的较新版本的.NET框架中的API,则它们可能仍然无法正常运行。

为旧版.NET框架构建的应用程序默认情况下会尝试在.NETframework3.5上运行。如果它未安装在目标计算机上,则应用程序将无法运行并提示用户安装.NETframework3.5。通过将supportedRuntime条目添加到应用程序配置文件(名为MyApplication.exe.config,其中MyApplication.exe是受影响的可执行文件名),可以更改此行为:

通过指定多个运行时,它们将尝试按给定的顺序使用,即在上面的示例中,如果在机器上安装.NETframework3.5(v2.0.表示CLR2.0),应用程序将使用它,否则它将运行在最新的.NET框架版本上安装。

或者,只有v4.0可以列在配置文件中,以强制应用程序使用最新版本的.NET框架运行,即使还安装了.NETframework3.5。如果知道应用程序与最新版本的.NET框架没有任何问题,这将允许它利用CLR4中的优化而无需重新编译它。

VisualStudio中的多目标

为了帮助开发.NET框架版本的应用程序,VisualStudio提供完整的多目标支持。创建新项目时,“新建项目”对话框中提供了一个下拉列表,用于选择.NET框架版本。

这不仅会影响新项目的配置方式,还会隐藏所选.NETFramework版本中不支持的任何项目模板(例如,选择.NETframework2.0时无法创建WPFApp,因为它仅被引入在.NETframework3.0中。

图1:“新建项目”对话框中的.NET框架下拉列表

VisualStudio将确保您可以使用所选.NET框架版本中包含的API。如果您尝试使用任何不受支持的文件,则会在代码编辑器中对其进行相应标记。

图2:代码编辑器中标记为错误的不支持的API

可以在以后的项目属性窗口的“应用程序”选项卡上更改现有项目的目标框架。这与在创建项目时已选择目标框架的效果相同。如果现有代码使用的API在更改后不可用,则在修复代码或更改目标框架之前,项目将无法构建。编译器还会警告任何不可用的引用系统程序集,以便可以从项目引用中删除它们。

图3:更改现有项目的目标框架

使用哪个版本的C#?

无论我们在项目中使用哪个.NET框架版本,使用的C#语言版本都不会更改。这很好,因为在该语言的更高版本中引入的绝大多数语言功能不依赖于CLR或特定的API。它们只是语法糖,编译器生成的字节码仍然可以在.NETframework2.0中使用。

但是有几个例外。

例如,async和await关键字是基于任务的异步模式的语法糖,它仅在.NET4中引入,因此它们不能在早期版本的.NET框架中使用。它们还依赖于一些其他类,这些类仅在.NETframework4.5中可用。但是,可以通过安装Microsoft.Bcl.AsyncNuGet包将这些添加到项目中。这样,您就可以在面向.NETframework4的项目中开始使用async和await关键字。

同样,某些编译器功能依赖于其实现中的特定属性:

·要使用扩展方法编译代码,需要System.Runtime.CompilerServices.ExtensionAttribute。它仅在.NETframework3.5中引入。

·调用者信息属性仅在.NETframework4.5中添加,如果没有它们,我们无法告诉编译器我们的意图,尽管生成的代码仍然可以在旧版本的.NET框架中使用。

虽然没有正式的NuGet包来使这两个功能可用于旧版本的.NET框架,但编译器只需要存在具有正确完全限定名称的属性即可使其工作。您可以在自己的代码中声明它们,也可以安装一个非官方的NuGet包。

但是,在针对较旧版本的.NET框架时,上述限制并不会阻止您使用最新版本的编译器。如果您尝试使用不受支持的功能,代码编辑器将立即发出警告,以便您可以在仍然利用所有其他支持的功能的同时避免使用该功能。

话虽如此,当您可能希望在项目中使用旧版本的编译器时,仍然存在合法的用例。

每个编译器版本仅可从最初发布的VisualStudio版本中获得。如果项目中的某些开发人员仍在使用较旧的VisualStudio,则需要避免使用较新的语言功能,否则他们将无法编译代码。要安全地实现此目的,您可以在“高级构建设置”对话框中指定语言版本,可通过项目属性的“构建”选项卡上的“高级...”按钮访问。

图4:“高级构建设置”对话框中的语言版本选择

结论:

将应用程序部署到更严格管理的环境时,可能会遇到可以提供哪些版本的.NET框架的限制。

由于向后兼容性,为旧版.NET框架开发的大多数应用程序在最新版本的.NET框架上运行得很好,如果不是更好的话。只要您声明应用程序配置文件中支持运行时,它们甚至可以在不重新编译的情况下运行。

另一方面,在针对较旧版本的.NET框架时,您需要避免使用尚不可用的API。如果您正确设置了项目属性中的.NET框架版本,VisualStudio可以为您提供帮助。您将能够继续使用最新版本的C#,除非您的团队成员仍在使用旧版本的VisualStudio。

1
查看完整版本: 构建不同NETFramework版本的