.Net 4.0新特性和改进浅谈

About .Net 4.0

 

1. 兼容性一直是个令人很头疼的问题,在.NET 4.0中,在同一个进程中,不同运行时(CLR)上的组件可以同时运行,我们称之为In process Side by Side。

    在Win32时代,我们一般开发一种叫做动态连接库或者COM的组件,为了减少私有安装带来的体积臃肿(也就是将被调用的组件部署到和自己同一个目录体系下,并且每个应用都会这样做,那么一个OS里面会被塞满N个同样的dll),想出了将N个应用都要调用的dll部署在一个“共享”的地方的想法,那么Win32是如何实现的哪,那就是使用注册表和System32目录,在应用程序安装的时候, 安装程序会把dll拷贝到system32目录,然后再将其接口的信息(IDL)和地址(copy到了哪个目录)注册到操作系统的注册表中,这个过程叫做“注册组件”,那么之后,所有要使用此dll的程序只需要先check注册表,发现了需要被调用的dll的接口和地址信息,然后再到dll所在的目录去调用所需的API。

    以上这样做是解决了臃肿和共享程度低的问题,但是又带来了新问题,那就是臭名昭著的“Dll地域”的问题,如果dll可能版本升级,那么就可能造成某些旧版本的程序无法使用了。

    .Net出现之后,这种情况彻底被改观,到目前为止其他OS,或者平台还没有类似的解决办法,这种解决办法叫做并行执行,什么意思哪?就是老版本的组件和新版本的组件都可以存在于同一个系统之内,另外他们的文件名是一样的,从表面看来没有什么区别,但是应用程序可以区别它们,但是这是怎么实现的哪?在.Net安装的时候,会自动在Windows外壳挂接一个插件并在内核挂接一个处理器与之对应,那么这个被安装到OS上的这个东西叫做GAC(全局构件缓存),在外壳挂接的部分,我们可以直接在一个目录看到GAC,就是C:\Windows\assembly目录,自动列出被注册到GAC的.Net Assembly,它可以把同一个组件(dll,在.Net上一个组件也被编译成dll,但是含义不同,是基于.Net CLR托管的代码,那么叫做Assembly,有着不同于Win32格式的PE格式)的不同版本“缓存”在GAC中,那么所有引用它的程序,不管dll版本如何,都能不受影响的使用。你可能会问,应用程序如何区别同名的dll为不同版本的?很简单,加强名,什么强名:计算组件的hash值,这个值是根据组件名称+版本号+...而计算出来的,并签署到dll文件头中(PE文件头),只要应用在开发时期,引用了这个版本的组件,那么应用程序就”记住“了这个组件的强名,那么不管以后版本如何升级,旧的应用照样可以使用旧的dll而不会和新的dll冲突,那么以上旧的应用和新的应用同样可以运行良好了了。

 

    GAC强制要求在其注册的组件必须实现强名。GAC解决了所谓的"dll地狱“的问题,没有使悲剧重演。对于.Net 4.0,更改进了这种并行执行的方式,此功能能够使应用程序在同一进程中加载和启动.NET框架的多个版本。例如,您可以在同一进程中运行加载插件(或组件)的应用程序,程序本身基于.NET框架 2.0 SP1而插件基于.NET框架4。更早一些的组件将继续使用早的.NET框架版本,而新的组件使用新的.NET框架版本。 

2. 对于很多同时包含COM组件和托管代码的应用程序,Primary Interop Assembly (PIA) 一直程序在部署方面令人很头疼的问题。现在,.NET 4.0中加入了称为NO-PIA的新功能,使得Interop的版本类型匹配仅通过简单的属性(TypeIdentifierAttribute)和GUID就能实现,免去了繁杂的PIA部署,也减少了应用程序的部署大小。

3 .NET 4.0也为引入动态语言与功能性语言做了相应的改进。包括一些新类型,如BigIntegers,Tuples,并对Tail recursion 的情况作了优化。C#提供了更好的动态语言特征。http://publish.itpub.net/focus/201008/csharp/index.html

4..NET 4.0提高了并行计算的线程性能。

5..NET 4.0中加入了后台垃圾回收功能(Background GC),使得垃圾回收时发生的延迟现象明显减少。在4.0以前的版本中,在调用System.GC时,总是带来性能下降,或者不是及时垃圾回收无用的对象,使得垃圾回收效率大大折扣。

6 .NET 4.0对一些常见异常,如除零计算、Access Violation等,作了一些特别处理,使得这些问题在新的运行时中更难出现。

开发工具方面:

7.对于Profiler,.NET 4.0中的Profiler提供更好的CPU采样功能,实时的堆分析和对象引用图表。那么就更加容易地发现性能问题的所在了

8...NET 4.0支持dump debugging,可以提供重现crash的信息,使开发人员对crash的情况的调试更有效。

9..NET 4.0支持64位的混合模式调试,使得托管代码和非托管代码之间的调试更方便。

10..NET 4.0提供Code Contracts,可以通过编程方式制定代码规则。

 

 

类库方面:

11. WF有较大的变化,至少与.Net 3.0/3.5那个时候的WF大不一样。

 

12. WPF,变得更加“炫”了.

之前来自WPF Toolkit的3个控件现在移到核心发布库中。具体是,DataGrid、DatePicker和Calendar控件。它们也具有Silverlight相应的版本,微软承诺在WPF和Silverlight中的版本“99%的API和行为都兼容”。DataGrid特别重要,由于缺乏这个东西,WPF经常被提到不适合于业务处理应用程序。

在4.0发布之后,还计划发布两个扩展包,每一个都包含了额外的控件。“锦囊”将包含AnimatingTilePanel、ColorPicker、InfoTextBox、ListPager、NumericUpDown、Reveal、TransitionsPresenter和TreeMapPanel。另外一个是WPF Ribbon Control,它目前处于CTP阶段。

在图形方法,对Pixel Shader 3.0的支持已经加入。以前的WPF只能藉由ShaderEffect支持Pixel Shader 2.0。对于开发人员,也许更重要的是LayoutRounding。它将强制布局引擎把元素放到整个像素边界。当前的控件只能排到子像素边界上,这会导致模糊的界面。

说起模糊的界面,WPF知名的文本渲染问题也被解决了。为了搞定这个问题,老的文本渲染代码被完全代替。随着而来的还有几个文本格式选项,可以实现某种程度的微调。
Windows 7获得了极大的关注。WPF 4.0将提供对多点触摸、JumpList和任务栏集成的支持。缩略图工具栏特别有意思。即使在应用程序最小化的情况下,也可以让用户与之交互。

在数据绑定前端,添加了绑定到实现IDynamicMetaObjectProvider接口的动态对象的支持。这囊括了所有基于DLR的语言,如IronRuby和IronPython。

来自于Silverlight的可视化状态管理器(Visual State Manager)特性也进入了WPF的世界。WPF已经具有了无比强大的触发器功能,不过它比起Silverlight的可视化状态管理器难用的多

 

13,WCF,真是用它想要什么有什么:web service, Restful Web service, WCF service.........,只要你能想到的都有。

WCF4.0最显著的变化就是下面5点,简化配置、动态服务发现、路由服务、REST改进和工作流服务。简要介绍如下:

  1. )简化配置:WCF4.0里的简化配置其实是通过提供默认的终结点、绑定和服务行为的配置来实现的。我们可以做更少的配置工作来开发出一个WCF程序。当然这样做的最大好处就是可以加速开发流程,增强开发体验。
  2. )WS-Discovery:WCF支持2种模式的服务发现:ad-hoc 和managed , WS-Discovery规范是2005年制定完成,2008年通过OASIS,结构化信息标准促进组织(OASIS)的审批。
  3. )路由服务:WCF4.0支持可配置的路由服务,你可以在WCF项目里使用。 它支持基于内容的路由、协议桥和错误处理特性。
  4. )REST改进:加强了WCF 3.5 Web 编程模型特性,简化了REST WCF服务的开发过程.
  5. )Workflow服务:增强了WCF 和WF 在长时间运行的工作流服务里的集成特性。 WCF & WF Framework支持这些特性,来改善你的开发体验.

【2】WCF4.0新特性列表:

     WCF其实做了很多改进,上面5点只是主要的几点。其实他内存管理,跟踪调试等功能也做了改进。下面是这些新特性的列表:

  1).Simplified configuration
  2).Standard endpoints
  3).IIS hosting without an SVC file
  4).WS-Discovery
  5).Routing service (previously included with Dublin)
  6).REST caching and help page
  7).Workflow services
  8).Non-destructive queue receive
  9).Simple byte stream encoding
  10).ETW tracing

  中文名称对应列表:

  1).简化配置:提供了默认的终结点、绑定和行为设置。
  2).标准终结点 :增加了一些标准的预定义的终结点。mexEndpoint,announcementEndpoint,discoveryEndpoint,  udpAnnouncementEndpoint,udpDiscoveryEndpoint,WorkflowControlEndpoint,webHttpEndpoint,  webScriptEndpoint。
  3).无SVC文件IIS托管:以前托管WCF服务需要SVC扩展名,现在不需要就可以托管WCF服务。
  4).WS-Discovery :动态服务发现协议,ad-hoc 和managed 2种模式。简单理解就是:一个是主动发现,一个是代理机构查找服务。
  5).路由服务(以前包含在Dublin) :基于内容的路由和可配置路由的支持。
  6).REST缓存和帮助页面:对Rest服务的支持做了改进。
  7).工作流服务:对于WF集成的新特性的支持。比如长时间运行的工作流服务。
  8).非破坏性队列接收:改进队列接收机制。
  9).简化字节流编码:对字节流编码做了优化。
  10).ETW 跟踪:Windows事件跟踪机制的支持。优化了Tracing的性能。

14.ASP.net的大量改进。使得Web开发更加现代和方便:

1)微软向ASP.net开发者提供了大量可免费下载的图表控件,可以在.NET 3.5 ASP.NET或WinForms项目中使用这些控件。要想在Visual Studio 2008中使用这些控件则需要安装一个插件,该插件提供了VS工具箱及智能集成功能。现在这些控件已经集成到了.NET 4.0中,这样就无需再去下载额外的插件了。Samples Environment for MS Chart Controls提供了这些控件的使用示例。

2)微软发布了一个SEO Toolkit并集成到了IIS 7中,同时可以在IIS Manager中运行。除了可以创建站点地图和地图索引外,该工具集还能够从SEO的视角分析站点情况,在出现SEO规则违例时生成报告:创建错误描述并给出进一步的改进提示。这些规则有:重复的文件、重复的标题、没有内容、过多的内容等等。该工具集会从性能视角分析站点,识别出运行缓慢或是会访问很多资源的页面。我们还可以通过增加自定义规则来扩展该工具集。

虽然该SEO Toolkit需要运行在IIS Manager上,但并不需要在服务器上安装别的东西。此外,它还可以对所有操作系统上的所有Web服务器进行分析。Scott Guthrie总结了可以进一步提升SEO的ASP.NET 4.0中的新特性,如下:

  ◆Page.MetaKeywords与Page.MetaDescription;

  ◆ASP.NET Web Forms的URL Routing支持;

  ◆Response.RedirectPermanent()。

  我们可以通过Page类的MetaKeywords和MetaDescription属性以编程的方式设定站点的关键词和描述。Guthrie阐述了这么做的意义所在:

  ASP.NET 4.0的服务器端控件会在输出页面的部分时使用到他们,这对于使用了母板页的站点非常有用——部分位于.master文件中,这就与包含了具体页面内容的.aspx文件独立开来,现在可以在.aspx页面中设定新的MetaKeywords和MetaDescription属性并通过母板页中的控件自动生成其值。URL Routing会将外部URL转换为内部的。通过这种方式,站点可以公开SEO友好的URL,但却可以在内部使用不同的链接。这对于遗留站点来说非常有用。

  我们应该使用Response.RedirectPermanent()方法而非Response.Redirect(),因为后者会生成一个临时的重定向,这导致搜索引擎在多个重定向之间跳跃,降低了页面的等级。Guthrie解释了RedirectPermanent()的工作方式:

  3)ASP.NET 4.0引入了一个全新的Response.RedirectPermanent(string url)辅助方法,可以通过HTTP 301(moved permanently)响应进行重定向。这样,搜索引擎和其他能够识别出永久重定向的user agents就会存储并使用与内容关联的新URL。这么做会为页面内容加上索引,同时提升搜索引擎对页面的PR(Page Ranking)值。

对于缓存,自从1.0开始,ASP.NET就拥有了一个输出缓存来存储页面和资源以提供更快的响应速度,但存储位置只能在内存中。ASP.NET 4.0提供了一个扩展点,可以在本地/远程磁盘、数据库、分布式缓存引擎(如velocity、memcached)甚至是云中增加多个缓存。 

     4) 对于Ajax,ASP.net 4.0新继承了客户端Ajax框架Jquery,使得Ajax开发更加便捷。

 

5)ASP.NET 4.0新特性中,关于ClientID的改进可以在执行嵌套空间时,控制生成的Html的ID的情况。以往进行这样的操作时,很容易出现错误,很难控制。

6) 列表控件的新属性EnablePersistedSelection - 保存选中项的方式。 控件的其他一些增强点,RenderOuterTable - 指定控件在客户端呈现的时候,是否在外层加 table 标签,Menu 控件,在 asp.net 4.0 中将会以 ul li 的方式呈现在客户端,RepeatLayout - 布局模式,控件在客户端的 HTML 呈现方式,Wizard 和 CreateUserWizard 新增了 LayoutTemplate 模板,  原来使用 ListView 必须要有 LayoutTemplate ,在 asp.net 4.0 中可以不再用它了.

7)简洁的 web.config,配置信息被移到了 machine.config

8) 更加简洁的VS设计期开发方式。

9) ASP.net的代码编辑器和设计器,提供更好的Javascript及HTML代码智能感知

10)新增了项目模板。在新模板中有如下改进:
基础MemberShip功能。在大多数网站和应用程序中需要进行认证,因此在新模板中增加了认证功能使得用户能在Web项目中队身份认证快速上手,有关身份验证的模块的文件都放在Account文件夹下;
增加了默认的母版页。使用母版页能比较方便地统一网站网页的展示,如涉及到网页顶部、用户登录状态显示及菜单部分,默认的母版页文件名为Site.master;
增加了默认的css样式文件。使用css样式文件能使我们很方便地调整网站风格,在新建网站时会增加一个名为Site.css的样式文件,它位于Styles文件夹下。

11)  在asp.net 4.0 中 有新的System.Web.Routing,提供所有的重要的类RouteTable,PageRouteHanlder类,在最初System.Web.Routing是整合在asp.net MVC 中的,可是asp.net 团队
eb需要发现这个组件很有用,就将他推广到WebForm中,所以我们只需要引用相应的DLL就能在WebFrom上使用。
它能帮助你创建友好的URL,协助搜索引擎优化。清楚URLs中不友好的编码,而使得搜索引擎能能高性能的检测URL.

12)动态数据方面,包括针对现有Web应用程序的支持,全对多对多关系和继承的支持,对字段模板和属性的支持,以及增强的数据过滤功能。

 

15.托管扩展性框架(MEF)是.NET框架4中的一个新库,帮助您构建可扩展的和可组合式应用程序。MEF可以让您指定在一个应用程序中的扩展点,给其他扩展的应用程序提供服务,以及创建可扩展应用程序所使用的部件等。MEF还支持很容易地基于元数据搜索到可用的部件,而无需为这些部件加载相应的程序集。有关MEF类型的列表,你可以参阅System.ComponentModel.Composition命名空间。

16. .NET框架 4针对编写多线程和异步代码引入了一个新的编程模式,从而极大地简化了应用程序和库开发者的编程。此新的模式可以使开发人员以一种自然的方式来编写高效的,良好粒度的,可扩展的并行代码,而不必直接使用线程或线程池等。新的System.Threading.Tasks命名空间和其他相关类型支持这种新模式。并行LINQ(PLINQ),作为LINQ to Objects的一种并行实现,能够通过声明性语法支持类似的功能。

16.ADO.NET的实体框架中提供了新功能,包括持久化透明对象(Persistence-Ignorant Objects,注:这种对象具有不必事先在DBMS中建立实体信息就可以利用实体框架的DDL生成功能将POCO对象结构转换成实体信息结构以存入信息库中的能力。),在LINQ查询功能和自定义对象层代码生成等。

 

其他方面:

17.提供了新的语言成员-F#,函数式编程语言。

18.在4.0前如果需要进行并行任务往往都是自己实现Task和Task Factory来管理任务,其中难免会牵涉到大量的线程和线程池的管理工作。到了4.0 这部分内容都已经集成到基础类库中了。在System.Threading.Task中新增了几个类:

  Task

  TaskFactory

  TaskScheduler

19.在.NET4.0之前如果需要在多线程环境下操作集合类型的对象往往需要额为每种操作添加比较复杂的锁机制才能保证每个线程对资源的访问安全,在4.0的Collection名称空间下面又多了一个新的名称空间Concurrent,在这个名称空间下面增加了几个非常有用的线程安全的类。

 

 

BlockingCollection 为实现 IProducerConsumerCollection<(Of <(T>)>) 的线程安全集合提供阻止和限制功能。
 
ConcurrentBag 表示对象的线程安全的无序集合。
 
ConcurrentDictionary 表示可由多个线程同时访问的键值对的线程安全集合。
 
ConcurrentQueue 表示线程安全的先进先出 (FIFO) 集合。
 
ConcurrentStack 表示线程安全的后进先出 (LIFO) 集合。
 
OrderablePartitioner 表示将一个可排序数据源拆分成多个分区的特定方式。
 
Partitioner 提供针对数组、列表和可枚举项的常见分区策略。
 
Partitioner 表示将一个数据源拆分成多个分区的特定方式。

 

 


 

 

 

 

你可能感兴趣的:(.Net,Platform)