频道栏目
读书频道 > 软件开发 > C# > C#入门经典(第6版)
1.1.2 使用.NET Framework编写应用程序
2013-12-28 16:12:39     我来说两句
收藏   我要投稿

本文所属图书 > C#入门经典(第6版)

《C 入门经典 系列是屡获殊荣的C 名著和超级畅销书。最新版的 C 入门经典(第6版) 面向编程新手,全面介绍使用C 2012和 NET Framework编写程序的基础知识。本书无与伦比的作者团队与您分享多年积累的C 和 N  立即去当当网订购

使用.NET Framework编写应用程序,就是使用.NET代码库编写代码(使用支持Framework的任何一种语言)。本书用VS进行开发,VS是一种强大的集成开发环境,支持C#(以及托管和非托管C++、Visual Basic和其他一些语言)。这个环境的优点是便于把.NET功能集成到代码中。我们创建的代码完全是C#代码,但使用了.NET Framework,并在需要时利用了VS中的其他工具。

为执行C#代码,必须把它们转换为目标操作系统能够理解的语言,即本机代码(native code)。这种转换称为编译代码,由编译器执行。但在.NET Framework下,此过程包括两个阶段。

1. CIL和JIT

在编译使用.NET Framework库的代码时,不是立即创建专用于操作系统的本机代码,而是把代码编译为通用中间语言(Common Intermediate Language,CIL)代码,这些代码并非专门用于任何一种操作系统,也非专门用于C#。其他.NET语言,如Visual Basic .NET也会在第一阶段编译为这种语言。开发C#应用程序时,这个编译步骤由VS完成。

显然,要执行应用程序,必须完成更多工作,这是Just-In-Time(JIT)编译器的任务,它把CIL编译为专用于OS和目标机器结构的本机代码。这样OS才能执行应用程序。这里编译器的名称Just-In-Time反映了CIL代码仅在需要时才编译的事实。这种编译可以在应用程序的运行过程中动态发生,不过开发人员一般不需要关心这个过程。除非要编写性能十分关键的代码,否则知道这个编译过程会在后台自动进行,并不需要人工干预就可以了。

过去,常常需要把代码编译为几个应用程序,每个应用程序都用于特定的操作系统和CPU结构。这通常是一种优化形式(例如,为了让代码在AMD芯片组上运行得更快),有时则是非常重要的(例如,使应用程序可以同时工作在Win9x和WinNT/2000环境下)。现在就不必要了,因为JIT编译器使用CIL代码,而CIL代码是独立于计算机、操作系统和CPU的。目前有几种JIT编译器,每种编译器都用于不同的结构,CIL会使用合适的编译器创建所需的本机代码。

这样,开发人员需要做的工作就比较少了。实际上,可以忽略与系统相关的细节,将注意力集中在代码的功能上就够了。

读者可能遇到过Microsoft Intermediate Language(MSIL)或IL,MSIL是CIL原来的名称,许多开发人员仍沿用这个术语。

2. 程序集

在编译应用程序时,所创建的CIL代码存储在一个程序集中。程序集包括可执行的应用程序文件(这些文件可以直接在Windows上运行,不需要其他程序,其扩展名是.exe)和其他应用程序使用的库(其扩展名是.dll)。

除包含CIL外,程序集还包含元信息(即程序集中包含的数据的信息,也称为元数据)和可选的资源(CIL使用的其他数据,例如,声音文件和图片)。元信息允许程序集是完全自描述的。不需要其他信息就可以使用程序集,也就是说,我们不会遇到没有把需要的数据添加到系统注册表中这样的问题,而这在使用其他平台进行开发时这个问题常常出现。

因此,部署应用程序就非常简单了,只需把文件复制到远程计算机上的目录下即可。因为不需要目标系统上的其他信息,所以只需从该目录中运行可执行文件即可(假定安装了.NET CLR)。

当然,不必把运行应用程序需要的所有信息都安装到一个地方。可以编写一些代码来执行多个应用程序所要求的任务。此时,通常把这些可重用的代码放在所有应用程序都可以访问的地方。在.NET Framework中,这个地方是全局程序集缓存(Global Assembly Cache,GAC),把代码放在这个缓存中是很简单的,只需把包含代码的程序集放在包含该缓存的目录中即可。

3. 托管代码

在将代码编译为CIL,再用JIT编译器将它编译为本机代码后,CLR的任务尚未全部完成,还需要管理正在执行的用.NET Framework编写的代码(这个执行代码的阶段通常称为运行时(runtime))。即CLR管理着应用程序,其方式是管理内存、处理安全性以及允许进行跨语言调试等。相反,不受CLR控制运行的应用程序属于非托管类型,某些语言(如C++)可以用于编写此类应用程序,例如,访问操作系统的低级功能。但是在C#中,只能编写在托管环境下运行的代码。我们将使用CLR的托管功能,让.NET处理与操作系统的任何交互。

4. 垃圾回收

托管代码最重要的一个功能是垃圾回收(garbage collection)。这种.NET方法可确保应用程序不再使用某些内存时,就会完全释放这些内存。在.NET推出以前,这项工作主要由程序员负责,代码中的几个简单错误会把大块内存分配到错误的地方,使这些内存神秘失踪。这通常意味着计算机的速度逐渐减慢,最终导致系统崩溃。

.NET垃圾回收会定期检查计算机内存,从中删除不再需要的内容。执行垃圾回收的时间并不固定,可能一秒钟内会进行数千次的检查,也可能几秒钟才检查一次,不过一定会进行检查。

这里要给程序员一些提示。因为在不可预知的时间执行这项工作,所以在设计应用程序时,必须留意这一点。需要许多内存才能运行的代码应自己完成清理工作,而不是坐等垃圾回收,但这不像听起来那样难。

5. 把它们组合在一起

在继续学习之前,先总结一下上述创建.NET应用程序所经历的步骤:

(1) 使用某种.NET兼容语言(如C#)编写应用程序代码,如图1-1所示。

(2) 把代码编译为CIL,存储在程序集中,如图1-2所示。
 

        

  1-1                                     1-2

(3) 在执行代码时(如果这是一个可执行文件,就自动运行,或者在其他代码使用它时运行),首先必须使用JIT编译器将代码编译为本机代码,如图1-3所示。
 

  1-3

(4) 在托管的CLR环境下运行本机代码,以及其他应用程序或进程,如图1-4所示。
 

  1-4

6. 链接

在上述过程中还有一点要注意。在第(2)步中编译为CIL的C#代码未必包含在单独文件中,可以把应用程序代码放在多个源代码文件中,再把它们编译到一个程序集中。这个过程称为链接(linking),是非常有用的。原因是处理几个较小的文件比处理一个大文件要简单得多。可以把逻辑上相关的代码分解到一个文件中,以便单独进行处理,这也更便于在需要时找到特定的代码块,让开发小组把编程工作分解为一些可管理的块,让每个人编写一小块代码,而不会破坏已编写好的代码部分或其他人正在处理的部分。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.1.1 .NET Framework的内容
下一篇:1.2 C#的含义
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站