C#学习之.NET系统架构(二)

C# 专栏收录该内容
8 篇文章 0 订阅

4. 程序集

程序集(assembly)是包含编译好的、面向.NET Framework的代码的逻辑单元。

​程序集是完全自我描述的,也是一个逻辑单元而不是物理单元,它可以存储在多个文件中(动态程序集存储在内存中,而不吃存储在文件中)。如果一个程序集存储在多个文件中,其中就会有一个包含入口点的主文件,该文件描述了程序集中的其他文件。

​可执行代码和库代码使用相同的程序集结构。唯一的区别是可执行的程序集包含一个主程序的入口点,而库程序集不包含。

​程序集的一个重要特征是它们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个“程序集清单”的区域中,可以检查程序集的版本及其完整性。

​可以通过Windows的实用工具ildasm来检查程序集的内容,包括程序集清单和元数据。

​程序集包含程序的元数据,表示调用给定程序集中的代码的应用程序或其他程序集不需要指定注册表或其他数据源,以确定如何使用该程序集。这与之前的COM有很大的区别,以前,组件的GUID和接口必须从注册表中获取,在某些情况下,方法和属性的详细信息也需要从类库中读取。

​把数据分散在3个以上的不同位置上,可能会出现信息不同步的情况,从而妨碍其他软件成功地使用该组件。但是,有了程序集后,就不会发生这样的情况,因为所有的元数据都与程序的可执行指令存储在一起。注意,即使程序集存储在几个文件中,数据也不会出现不同步的问题。这是因为包含程序集入口的文件也存储了其他文件的细节、散列和内容,如果一个文件被替换,或者被塞满,系统肯定会检测出来,并拒绝加载程序集。程序集有两种类型,共享程序集和私有程序集。

4.1 私有程序集

私有程序集是最简单的程序集类型,私有程序集一般附带在某个软件上,且只能用于该软件。附带私有程序集的情况是,以可执行文件或许多库的方式提供应用程序,这些库包含的代码只能用于该应用程序。

​系统可以保证私有程序集不被其他软件使用,因为应用程序只能加载位于主执行文件所在文件夹或其子文件中的程序集。

​用户一般会希望将商用软件安装在它自己的目录下,这样,软件包没有覆盖、修改或加载对一个软件包的私有程序集的风险。私有程序集只能用于自己的软件包,这样,用户对什么软件使用它们就有了更多的控制。因此,不需要采取安全措施,因为这没有其他商业软件用某个新版本的程序集覆盖原来的私有程序集的风险(当软件是专门执行患有恶意的损坏性的操作除外)。名称也不会有冲突。

​如果私有程序集的类正巧与另一个人的私有程序集中的类同名,是不会有问题的,因为给定的应用程序只能使用私有程序集的名称。

​因为私有程序集完全是自含式的,所以安装它们的过程就很简单。只需要把对应的文件放在文件系统的对应文件夹即可,不需要注册表项,这个过程称为“0影响(xcopy)安装”。

4.2 共享程序集

共享程序集是其他应用程序可以使用的公共库。因为其他软件可以访问共享程序集,所以需要采取一定的保护措施来防止以下风险。

  • 名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名,因为客户机代码理论上可以同时访问这些程序集,所以,这是一个很严重的问题。
  • 程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户机代码不兼容。

​这些问题的解决方法是把共享程序集放在文件系统的一个特定的子目录树中,成为全局程序集高速缓存(GAC)。与私有程序集不同,不能简单地将共享程序集复制到对应的文件夹中,而需要专门安装到高速缓存中,这个过程可以用许多.NET工具来完成,其中包含对程序集的检查,在程序集高速缓存中设置一个小的文件夹层次结构,以确保程序集的完整性。

​为了防止命名冲突,共享程序集应根据私钥加密法指定一个名称,私有程序集只需要指定与其主文件名相同的名称即可。共享程序集的名称也称为强名(strong name),以保证其唯一性,它必须由要引用共享程序集的应用程序来引用。

​与覆盖程序集相关的问题,可以通过在程序集清单中指定版本信息来解决,也可以通过同时安装来解决。

4.3 反射

因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这个技术叫做反射。它表示托管代码实际上可以检查其他托管代码,甚至检查它自己,以确定该代码的信息。他们常常用于获取特性的详细信息,也可以把反射用于其他目的,例如作为实例化类或调用方法的一种间接方式,如果把方法上的类名指定为字符串,就可以选择类来实例化方法,以便在运行时调用,而不是编译时使用,例如根据用户的输入来调用(动态绑定)。

5. .NET Framework类

编写托管代码的最大好处是可以使用.NET基类库

​.NET基类是一个内容丰富的托管代码类集合,可以完成通过Windows API来完成的绝大数任务。这些类派生自与中间语言相同的对象模型,也基于单一继承性。无论.NET基类是否合适,都可以实例化对象,也可以从它们派生自己的类。

​.NET基类的一个优点是它们非常直观和易用。例如,启动一个线程,可以调用Thread类的start()方法。要禁用TextBox,应把TextBox对象的Enabled属性设置为false。对于Visual Basic和Java开发人员这事很熟悉的操作。对于C++开发人员来说这是一个极大的解脱,因为他们使用诸如GetDIBits()、RegisterWndClassEx()和IsEqualID()这样的API函数,以及需要传递Windows句柄的函数。

​另一方面,C++开发人员总是很容易访问整个Windows API,而对于Visual Basic和Java开发人员只能访问其语言所能访问的基本操作系统功能。.NET新增的内容就是把Visual Basic和Java库的易用性和Windows API函数的丰富功能结合起来。但是,Windows还是有许多功能不能通过基类来完成,而需要调用API函数。但是一般情况下,这只限于比较复杂的特性。基类库足以应付日常生活的使用。这样需要调用API函数,.NET提供了所谓的“平台调用”,来确保对数据类型进行正确的转换,这样,无论是使用C#、C++或Visual Basic2008进行编码,该任务都不会比直接从已有的C++代码中调用函数更困难。

​我们可以通过Windows的实用程序WinCV浏览基类中的类、结构、接口和枚举。

​.NET3.5基类包括:

  • IL提供的核心功能,例如,通用类型系统的基本数据类型
  • WindowsGUI支持和控件
  • Web窗口(ASP.NET)
  • 数据访问(ADO.NET)
  • 目录访问
  • 文件系统和注册表访问
  • 网络和Web浏览
  • .NET特性和反射
  • 访问Windows操作系统的各个方面
  • COM互操作性

​根据Microsoft源文件,大多数.NET基类实际上都是用C#编写的

6. 命名空间

命名空间是.NET避免类名冲突的一种方式。例如,命名空间可以避免下述情况:定义一个类来表示顾客,称此类为Customer,同时其他人也在做相同的事(这里有一个类似的场景——顾客有相当多的业务)

​命名空间不过是数据类型的一种组合方式,当命名空间中所有数据类型的名称都会自动加上该命名空间的名字作为其前缀。命名空间还可以互相嵌套。例如,大多数用于一般目的的.NET基类位于命名空间System中,基类Array在这个命名空间中,所以其全名是System.Array。

​.NET需要在命名空间中定义所有的类型,例如,把Customer类放在命名空间YourCompanyName中,则这个类的全名就是YourCompanyName.Customer。

​如果没有显式提供命名空间,类型就添加到一个没有名称的全局命名空间中。

​Microsoft建议在大多数情况下,都至少提供两个嵌套的命名空间名,第一个是公司名,第二个是技术名称或软件包的名称,而类是其中的一个成员,例如YourCompanyName.Sales.Services.Customer。在大多数情况下,这么做可以保证类的名称不会与其他组织编写的类名冲突。

7. 用C#创建.NET应用程序

C#可以用于创建控制台应用程序:仅使用文本、运行在DOS窗口的应用程序。在进行单元测试类库、创建Unix/Linux daemon进程时,就要在使用控制台应用程序。但是,我们常常使用C#创建利用许多与.NET相关技术的应用程序。

7.1 创建ASP.NET应用程序

ASP时用于创建带动态内容的Web界面的一种Microsoft技术。ASP页面基本上是一个嵌套服务器端VBScript或JavaScript代码块的HTML文件。当客户浏览器请求一个ASP页面时,Web服务器就会发送页面的HTML部分,并处理服务器端脚本。这些脚本通常会查询数据库的数据,在HTML中标记数据。ASP时用户创建基于浏览器的应用程序的一种便利方式。

​当ASP也有缺点。首先,ASP页面优势显示地比较慢,因为服务器端代码时解释性的。而不舒畅编译性的。第二,ASP文件很难维护,因为他不是结构化的,服务器端的ASP代码和一般的HTML会混合在一起。第三,ASP优势开发起来会非常困难,因为它不支持错误处理和类型检查。特别是如果使用VBScript,并希望在页面中进行错误处理,就必须使用On Error Resume Next语句,通过Err.Number检查每个组件调用,以确保该调用正常运行。

​ASP.NET是ASP的全新修订版本,它解决了ASP的许多问题。当ASP.NET页面并没有替代ASP,而是可以和原来的ASP应用程序在同一个服务器上并存。当然,也可以用C#编写ASP.NET

7.1.1 ASP.NET的特性

首先,也是最重要的,ASP.NET页面是结构化的。这就是说,每个页面都是一个继承了.NET类System.Web.UI.Page的类,可以重写在Page对象的生命周期中调用的一系列的方法。我们可以把这些事件看作是页面所特有的,对应于原ASP的global.asa文件中的OnApplication_Start和OnSession_Start事件。因为可以把一个页面的功能放在有明确含义的事件处理中,所以ASP.NET比较容易理解。

​ASP.NET页面的另外一个优点是可以在Visual Studio 2008中创建它们,在此环境下,可以创建ASP.NET页面使用的业务逻辑和数据访问组件。Visual Studio2008项目包含了与应用程序相关的所有文件。而且,也可以在服务器中调试传统的ASP页面。

​最清楚的是,ASP.NET的后台编码功能允许进一步采用结构化方法。ASP.NET允许把页面的服务器端功能单独放在一个类中,把该类编译成DLL,并把该DLL放在HTML部分下页面时,Web服务器就在页面的后台DLL中引发类中的事件。

​最后,ASP.NET在性能的提高是非常显著的。传统的ASP页面是和每个页面请求一起解释的,而Web服务器在编译后高速缓存ASP.NET页面。这表示以后对ASP.NET页面的请求就比ASP页面第一次执行的速度快得多。

​ASP.NET易于编写通过浏览器显示窗口的页面,在这内联网环境中使用。传统的方式是基于窗体的应用程序提供一个功能丰富的用户界面,当较难维护,因为它们运行在非常多的不同机器上。因此,当用户界面是必不可少的,并可以为用户提供拓展支持时,人们就会依赖基于窗体的应用程序。

7.1.2 Web窗体

为了简化Web页面的结构,Visual Studio 2008提供了Web窗体。它们允许创建Visual Basic6或者C++Builder窗口的方式图形化地创建ASP.NET页面。换而言之,就是把控件从工具箱脱饭到窗体上,再考虑窗体的代码,为空间编写事件处理程序。在使用C#创建Web窗体时,就是创建一个继承自Page基类的C#类,以及把这个类看作是后台编码的ASP.NET页面。当然必须使用C#创建Web窗体,而可以使用Visual Basic 2008或者另一种.NET语言创建。

​过去,Web开发的困难使一些开发小组不愿意使用Web。为了成功进行Web开发,必须了解非常多的不同的技术,例如VBScript、ASP、DHTML、JavaScript等。把窗体概念应用于Web界面,Web窗体就可以使Web开发容易许多。

7.1.3 Web服务器控件

用于添加到Web窗体上的控件与ActiveX控件并不是同一种控件,它们是ASP.NET命名空间中的XML标记,当请求一个页面时,Web浏览器会动态地把它们转换成HTML和客户端脚本。Web服务器能以不同的方式显示相同的服务器端控件,产生一个对应于请求者特定Web浏览器的转换。这意味着现在很容易为Web服务器写相当复杂的用户界面,而不必担心如何确保界面运行在可用的任何浏览器上,因为Web窗体会完成这些任务。

​可以使用C#或Visual Basic2008拓展Web窗体工具箱,创建一个新服务器端控件,仅是执行.NET的System.Web.UI.WebControls.WebControl类而已。

7.1.4 XML Web服务

目前,HTML页面解决了World Wide Web上的大部分通信问题。有个XML,计算机就能以用一种独立于设备的格式,在Web上彼此通信。在未来,计算机可以通过Web和XML交流信息,而不是专门的线路和专门的格式,例如EDI(Electronic Data Interchange)。XML Web服务是为面向Web的服务而设计的,即远程计算机彼此提供可以分析和重新格式化的动态信息,最后展示给用户。XML Web服务是计算机给Web上的其他计算机及XML格式展示信息的一种便利方式。

​在技术上,.NET上的XML Web服务是给请求的客户返回XML而不是HTML的ASP.NET页面。这种页面有后台编码的DLL,它包含了派生自WebService类的类。Visual Studio2008 IDE提供了引擎简化了Web服务的开发。

​公司选择使用XML Web服务主要有两个原因。第一个是因为它们依赖于HTTP,而XML Web服务可以把现有的网络(HTTP)用作传输信息的媒介。第二是因为XML Web服务使用XML,该数据格式是自我描述的、非专用的、独立于平台的。

7.2 创建Windows窗体

C#和.NET非常适合Web开发,且还未所谓的“胖客户端”应用程序提供了极好的支持,这种“胖客户端”应用程序必须安装在最终用户的机器上,来处理大多数操作,这种支持来自于Windows窗体。

​Windows窗体是Visual Basic 6窗体的.NET版本,要设计一个图形化的窗口界面,只需把控件从工具箱拖放到Windows窗体上即可。来确定窗体的行为,应为该窗体控件编写事件处理例程。Windows Form项目编译成.EXE,该.EXE必须与.NET运行库一起安装在最终用户的计算机上。与其他.NET项目类型一样,Visual Basic 2008和C#都支持Windows Form项目。

7.3 使用Windows Presentation Foundation(WPF)

有一种最新的技术叫做Windows Presentation Foundation(WPF)。WPF在创建应用程序时,使用XAML。XAML表示可拓展的应用程序标记语言(Extensive Application Markup Language)。这种在Microsoft环境下创建应用程序的新方式在2006年引入,是.NET Framwork3.0和Framework3.5的一部分。要运行WPF应用程序,需要在客户机上安装.NET Framework3.0或3.5.WPF可用于许多Windows的版本。

​XAML是用于创建窗体的XML声明,它代表WPF应用程序的所有可视化部分和操作。虽然可以编程利用WPF应用程序,但WPF是迈向声明式编程的第一步,而声明式编程是编程业的趋势。声明式编程指的是,不是利用编程语言,如C#,VB或Java,不是通过编程来创建对象,而是通过XML类型的编程来声明所有的元素。

7.4 Windows控件

Web窗口和Windows窗体的开发方式一样,但应为它们添加不同类型的控件。Web窗体使用Web服务器控件,Windows窗体使用Windows控件。

​Windows控件比较类似于ActiveX控件,在执行Windows控件后,他会编译为必须安装到客户机器上的DLL。实际上,.NET SDK提供了揣个实用程序,为ActiveX控件创建包装器,以便把它们放到Windows窗体上。与Web控件一样,Windows控件的创建需要派生自特定的类System.Windows.Forms.Control

7.5 Windows服务

Windows服务(也称为NT服务)是在Windows NT/2000/Vista后台运行的程序。当希望程序连续执行,响应事件,但没有用户的明确启动操作时,就应该使用Windows服务。例如,Web服务器上的World Wide Web服务,他们监听来自客户的Web请求。

​用C#编写服务是非常简单的。System.ServiceProcess命名空间的.NET Framework基类可以处理许多与服务相关的样本任务,另外,Visual Studio2008允许创建C# Windows Service项目,为基本的Windows服务编写C#代码。

7.6 Windows.Communication.Foundation(WCF)

通过基于Microsoft的技术,可以采用许多方式将数据和服务从一处移动到另一处。例如,可以使用ASP.NET Web服务,.NET Remoting、Enterprise Service和用于初学者的MSMQ。采用哪种技术,取决于具体要达到的目标,每种技术都有自己适合的场合。

​Microsoft把这些技术集成在一起。放在.NET Framework3.0或3.5中。现在,只有一种移动数据的方式——Windows.Commnunication.Foundation。WCF允许建立好服务后,只需修改配置文件,就可以用多种方式提供该服务(甚至可以在不同的协议下)。WCF是一种连接各种系统的强大的新方式。

8 C#在.NET企业体系结构中的作用

C#需要.NET运行库,在几年内大多数客户机——特别是大多数家用PC——就可以安装.NET。而且,安装C#应用程序在方式上类似于安装.NET可重新发布的组件。因为,企业环境中会有许多C#应用程序。实际上,C#为希望建立健全的n层客户机/服务器应用程序的公司提供了绝佳的机会。

​C#与ADO.NET合并后,就可以快速而经常访问数据库了。例如SQL Server和Oracle数据库。返回的数据集很容易通过ADO.NET对象模型或LINQ来处理,并自动显示为XML,一般通过办公室内联网来传输。

​一旦为新项目创建了数据库模式,C#就会为执行一层数据访问对象提供一个极好的媒介,每个对象都能提供对不同的数据库表的插入、更新和删除访问。

​因为这是第一个基于组件的C语言,所以C#非常适合执行业务对象层。它为组件之间的通信封装了杂乱的信息。让开发人员把精力集中在如何把数据访问对象组合在一起,在方法中精确地强制执行公司的业务规则。而且使用特性,C#业务对象可以配备方法集的安全检查、对象池和由COM+服务提供的JIT服务。另外,.NET附带的实用程序允许新的.NET业务对象与原来的COM组件交互。

​要使用C#创建企业应用程序,可以为数据访问对象创建一个Class Library项目,为业务对象创建另一个Class Library项目。在开发时,可以使用Console限度测试类上的方法。喜欢编程的人可以建立能自动从批处理文件中执行的Console项目,测试工作代码是否中断。

​注意,C#和.NET都会影响物理封装可重用类的方式。过去,许多开发人员把许多类放在一个物理组件中,因为这样安排会使部署容易很多;如果有版本冲突问题,就知道在何处检查。因为部署.NET企业组件仅是吧文件复制到目录中,所有现在开发人员就可以把他们的类封装到逻辑性更高的离散组件中,而不会遇到DLL Hell。

​最后,用C#编写的ASP.NET页面构成了用户界面的绝妙媒介。ASP.NET页面是编译过的,所以执行地比较快。他们可以在Visual Studio 2008 IDE中调试,所以更加健壮。它们支持所以的语言特性,例如早期绑定、继承和模块化,所以用C#编写的ASP.NET页面是很简洁的,很容易维护。

​经验丰富的开发人员对大做广告的新技术和语言都持非常怀疑的态度,不愿意利用新平台,这仅仅是它们不愿意用。即使一些比较奇异的特性如XML Web服务和服务器端控件不算在内,也可以确保C#和.NET至少提供了四个优点。

  1. 组件冲突将很少见,部署工作将更容易,因为同一组件的不同版本可以在同一台机器上运行,而不会发生冲突。
  2. ASP.NET代码不再难懂
  3. 可以利用.NET基类中的许多功能
  4. 对于需要Windows窗体用户界面的应用程序来说,利用C#可以很容易编写这类应用程序。

​在某种程度上,以前Windows窗体并未收到重视,因为没有Web窗体和基于Internet的应用程序。当如果用户缺乏JavaScript、ASP或相关技术的专业知识,Windows窗体仍是方便而快速地创建用户界面的一种可行选择。记住管理好自己的代码,使用户界面的逻辑与业务逻辑和数据访问代码分割开来,这样才能在将来的某一刻将应用程序迁移到浏览器上。另外,Windows窗体还为家用应用程序和一些小公司长期保留了重要的用户界面。Windows窗体的新智能客户特性(很容易以在线和离线方式工作)将能开发出新的、更好的应用程序。

9. 小结

这一章主要讨论了关于.NET的基础知识,回顾了.NET Framework和C#的关系。首先,介绍了所有面向.NET的语言如何编译为中间语言,之后由公有语言运行库进行编译和执行。讨论了程序集和.NET基类、COM组件、JIT编译、应用程序域、垃圾回收机制在.NET编译和执行过程中的作用。
在这里插入图片描述
本章讨论了IL的特性,特别是其强数据类型和面向对象的特性。探讨了这些特性如何影响.NET的语言,包括C#,并阐述了IL的强类型本质如何支持语言的互操作性,以及CLR服务,例如垃圾收集和安全性。讨论了CLS和CTS,来帮助处理语言互操作性。

​最后,讨论了C#如何用做基于几个.NET技术(包含ASP.NET)的应用程序的基础。

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值