Framework十年回顾 体积越小功能越强
在Visual Studio 2010正式发布后,.NET平台也差不多走过了十多年的时间。这十几年.NET Framework的发展是怎样的一个过程,本文将为您揭示.NET Framework十年发展路。bitscn向您推荐《Visual Studio进化史》专题配合您了解这篇文章。
自2000年6月22日微软向全球宣布自己的.NET战略,到现在已经十年多了。作为.NET战略的基础,Microsoft .NET
Framework 也已经发行了多个版本。下面,我们就来看看这些年来微软到底发布了哪些 .NET Framework 版本。
1. Framework CLR and Assemblies Release
2. ----------------------------------------------------------
3. 1.0 RTM 1.0.3705.0 Released with VS.NET (aka VS.NET 2002)
4. 1.0 SP1 1.0.3705.209
5. 1.0 SP2 1.0.3705.288
6. 1.0 SP3 1.0.3705.6018
8. 1.1 RTM 1.1.4322.573 Released with VS.NET 2003
9. 1.1 SP1 1.1.4322.2032
10. 1.1 SP1 1.1.4322.2300 (Windows Server 2003 32-bit version)
12. 2.0 RTM 2.0.50727.42 Released with VS2005 RTM
13. 2.0 SP1 2.0.50727.1433 Released with VS2008 RTM and .Net 3.5 RTM
14. 2.0 SP2 2.0.50727.3053 Released with VS2008 SP1 and .Net 3.5 SP1
16. Framework CLR New assemblies
17. ----------------------------------------------------------
18. 3.0 RTM 2.0 RTM 3.0.4506.30 Only "out-of-band" non-SP framework release
19. 3.0 SP1 2.0 SP1 3.0.4506.648 Released with VS2008 RTM and .Net 3.5 RTM
20. 3.0 SP2 2.0 SP2 3.0.4506.2152 Released with VS2008 SP1 and .Net 3.5 SP1
22. 3.5 RTM 2.0 SP1 3.5.21022.8 Released with VS2008 RTM and .Net 3.5 RTM
23. 3.5 SP1 2.0 SP2 3.5.30729.1 Released with VS2008 SP1
25. Framework CLR and Assemblies Release
26. ----------------------------------------------------------
27. 4.0 RTM 4.0.30319.1 Released with VS2010
注意,没有 CLR 3.0 和 CLR 3.5。
有些 Windows 操作系统中已经内置了 .NET Framework,如下所示:
Date & Time Bytes MB File Name
-------
---------------- ----------- ----- ---------------------------
2.0 SP2
2008/07/30 09:54 25,001,480 23.8 NetFx20SP2_x86.exe
3.5 SP1
2008/07/30 16:22 242,743,296 231.5 dotnetfx35setup.exe
4.0 RTM
2010/03/19 09:44 50,449,456 48.1 dotNetFx40_Full_x86_x64.exe
WIC 2009/11/23 20:24 1,226,536
1.2 wic_x86_chs.exe
可以看出,.NET Framework 3.5 SP1 安装程序特别大,而 .NET Framework
4.0 RTM 安装程序反而变小了很多,不知 Microsoft 使用了什么技术,在增加功能的基础上还大大减少了安装程序的大小。
我们来看看以下 ClrInfo.cs 吧:
1.
using
System;
2.
using
System.Text;
4.
namespace
Skyiv
5. {
public
class
ClrInfo
static
void
Main()
10. Console.WriteLine(" OS Version: {0}", Environment.OSVersion);
11. Console.WriteLine(" CLR Version: {0} ( {1} )", Environment.Version, RuntimeFramework.CurrentFramework);
12. Console.WriteLine("Default Encoding: {0}", Encoding.Default);
13. Console.WriteLine();
14. Console.WriteLine(
typeof
(
string
).AssemblyQualifiedName);
15. #if !NetFx20
16. Console.WriteLine(
typeof
(System.IO.Packaging.Package).AssemblyQualifiedName);
17. Console.WriteLine(
typeof
(System.TimeZoneInfo).AssemblyQualifiedName);
18. #endif
19. Console.WriteLine();
20. Console.WriteLine("Available Frameworks:");
21.
foreach
(var frame
in
RuntimeFramework.AvailableFrameworks) Console.WriteLine(" " + frame);
22. }
23. }
24. }
使用以下 makefile 文件来编译(请参见: 浅谈 make 工具):
1. CLR35 = C:\Windows\Microsoft.NET\Framework\v3.5
2. CLR40 = C:\Windows\Microsoft.NET\Framework\v4.0.30319
3. CSC35 = $(CLR35)\csc.exe
4. CSC40 = $(CLR40)\csc.exe
5. SRC1 = ClrInfo.cs RuntimeFramework.cs
7. ClrInfo20.exe: $(SRC1)
$(CSC35) -
out
:$@ $(SRC1) -D:NetFx20
10. ClrInfo35.exe: $(SRC1)
11. $(CSC35) -
out
:$@ $(SRC1) -r:WindowsBase.dll
13. ClrInfo40.exe: $(SRC1)
14. $(CSC40) -
out
:$@ $(SRC1) -r:$(CLR40)\WPF\WindowsBase.dll
使用 nmake.exe 进行编译(所需的 RuntimeFamework.cs 请参见 .NET Framework
CLR 版本检测):
1. E:\CS\ClrInfo
>
nmake ClrInfo20.exe
2. Microsoft (R) 程序维护实用工具 9.00.30729.01 版
5. C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe -out:ClrInfo20.exe ClrInfo.cs RuntimeFramework.cs -D:NetFx20
6. 适用于 Microsoft(R) .NET Framework 3.5 版的 Microsoft(R) Visual C# 2008 编译器 3.5.30729.1 版
9. E:\CS\ClrInfo
>
nmake ClrInfo35.exe
10. Microsoft (R) 程序维护实用工具 9.00.30729.01 版
13. C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe -out:ClrInfo35.exe ClrInfo.cs RuntimeFramework.cs -r:WindowsBase.dll
14. 适用于 Microsoft(R) .NET Framework 3.5 版的 Microsoft(R) Visual C# 2008 编译器 3.5.30729.1 版
17. E:\CS\ClrInfo
>
nmake ClrInfo40.exe
18. Microsoft (R) 程序维护实用工具 9.00.30729.01 版
21. C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -out:ClrInfo40.exe ClrInfo.cs RuntimeFramework.cs
22. -r:C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\WindowsBase.dll
23. Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
26. E:\CS\ClrInfo
>
dir *.exe
27. 2010/04/17 19:59 7,168 ClrInfo20.exe
28. 2010/04/17 19:59 7,168 ClrInfo35.exe
29. 2010/04/17 19:59 7,680 ClrInfo40.exe
使用 Sun VirtualBox 全新安装 Microsoft
Windows Server 2003 R2 Enterprise Edition Service Pack 2 操作系统:
运行 ClrInfo35.exe,结果如下所示:
运行 ClrInfo40.exe,结果如下所示:
好吧,让我们安装 Microsoft .NET Framework 2.0 SP2 吧。
然后运行 ClrInfo20.exe,结果如下所示:
1. D:\CS\ClrInfo
>
ClrInfo20
OS Version: Microsoft Windows NT 5.2.3790 Service Pack 2
CLR Version: 2.0.50727.3053 ( Net 2.0.50727.3053 )
4. Default Encoding: System.Text.DBCSCodePageEncoding
6. System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
8. Available Frameworks:
Net 1.1.4322
10. Net 2.0.50727
运行 ClrInfo35.exe,结果如下所示:
1. D:\CS\ClrInfo> ClrInfo35
3. Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly
4. 'WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or
5. one of its dependencies. 系统找不到指定的文件。
6. File name: 'WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
at Skyiv.ClrInfo.Main()
9. WRN: Assembly binding logging
is
turned OFF.
10. To enable assembly bind failure logging,
set
the registry value
11. [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
12. Note: There
is
some performance penalty associated with assembly bind failure logging.
13. To turn
this
feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
运行 ClrInfo40.exe,还是报“.NET Framework Initialization
Error”错误。
使用 Sun VirtualBox 的快照恢复功能将 Microsoft
Windows Server 2003 R2 Enterprise Edition Service Pack 2 操作系统恢复到全新安装的状态。
然后安装 Microsoft .NET Framework 4.0 RTM。
其中的 Microsoft .NET Framework 4 Client Profile 也可以单独安装的,这样安装包(41.0MB)会小一些,但是有些扩展功能就不能用了。
运行 ClrInfo40.exe,结果如下所示:
1. D:\CS\ClrInfo
>
ClrInfo40
OS Version: Microsoft Windows NT 5.2.3790 Service Pack 2
CLR Version: 4.0.30319.1 ( Net 4.0.30319.1 )
4. Default Encoding: System.Text.DBCSCodePageEncoding
6. System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
7. System.IO.Packaging.Package, WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
8. System.TimeZoneInfo, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
10. Available Frameworks:
11. Net 1.1.4322
12. Net 4.0.30319
运行 ClrInfo35.exe,结果如下所示:
这就是说,旧版本的 .NET 程序不能运行在新版本的 CLR 4.0 上面。
还有就是,安装了 .NET Framework 4.0 后,只能报告“Unable to find
a version of the runtime to run this application”,而不能象以前一样明确指出是需要 CLR 2.0.50727。
实际上,在 CLR 4.0 上也是可以运行 ClrInfo35.exe 程序的,只需要在同一目录下放一个以下内容的 ClrInfo35.exe.config 文件就行了:
1.
<configuration>
2.
<startup>
3.
<supportedRuntime
version="v4.0"
/>
4.
</startup>
5.
</configuration>
其运行结果和 ClrInfo40.exe 的一样。
现在我们接着安装 Microsoft .NET Framework 3.5 SP1。
可见,安装 .NET Framework 3.5 SP1 时,会自动安装 .NET Framework
2.0 SP2 和 .NET Framework 3.0 SP2。
然后再运行 ClrInfo35.exe (先删除
ClrInfo35.exe.config),结果如下:
1. D:\CS\ClrInfo
>
clrinfo35
OS Version: Microsoft Windows NT 5.2.3790 Service Pack 2
CLR Version: 2.0.50727.3053 ( Net 2.0.50727.3053 )
4. Default Encoding: System.Text.DBCSCodePageEncoding
6. System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
7. System.IO.Packaging.Package, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
8. System.TimeZoneInfo, System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
10. Available Frameworks:
11. Net 1.1.4322
12. Net 2.0.50727
13. Net 4.0.30319
注意 System.String、System.IO.Packaging.Package
和 System.TimeZoneInfo 的版本号。
总结一下:
◆.NET Framework 1.0 (CLR 1.0) 和 1.1 (CLR 1.1) 已经过时,强烈建议不要使用。
◆.NET Framework 2.0 (CLR 2.0) 是目前广泛使用的版本,提供了大部分的基础功能。
◆.NET Framework 3.0 (CLR 2.0) 增加了 WPF、WCF、WF 和 Card Space 等功能。
◆.NET Framework 3.5 (CLR 2.0) 增加了 LINQ、ADO.NET Entity
Framework 等功能。
◆.NET Framework 4.0 (CRL 4.0) 重新实现并改进了以前版本 .NET Framework 的功能,并且增加了 Parallel LINQ、Task Parallel Library 等新功能,强烈建议使用。旧版本的 .NET 程序可以通过配置 <supportedRuntime> 元素在 CLR 4.0 运行。