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,更改进了这种并行执行的方式,可以在不同的CLR上,同时运行同一个组件,令不同平台版本程序可以共存,比如.Net 1.1的程序和.Net 3.0的程序都可以使用同一个组件了。
?
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
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,变得更加“炫”了
13,WCF,真是用它想要什么有什么:web service, Restful Web service, WCF service.........,只要你能想到的都有。
14.ASP.net的大量改进。使得Web开发更加现代和方便。
?
语言方面:
15.提供了新的语言成员-F#,函数式编程语言。
?
?
?
?
?