1.6 Framework类库
.NET Framework包含了Framework类库(Framework Class Library,FCL),FCL是一组DLL程序集的统称,它含有数千个类型定义,每个类型都公开了一些功能.
例如:
1. Web 服务(Web service) 利用Microsoft的ASP.NET XLM Web Service技术或者Windows Communication Foundation(WCF)技术,可以简单的处理通过Internet发送消息.
2. Web窗体应用程序(Web Form) 开发基于HTML的应用程序(网站)
3. Windows应用程序 开发Windows GUI应用程序.是使用Windows窗体编程或者 Windows Presentation Foundation(WPF)编程技术来利用由Windows操作系统提供的更强大的,更出色的功能.
4. 富Internet应用程序(Rich Internet Application,RIA) 利用Microsoft的Silverlight技术,可以构建通过Internet来部署的GUI应用程序,这种程序能在Web浏览器的内部或外部运行,还可以在非Windows操作系统与移动设备上运行.
5. Windows 控制台应用程序 它提供了一种快速、简单的方式来生成一个应用程序.编译器、使用程序和工具一般都是作为控制台应用程序来实现的
6. Windows 服务 可以使用.NET Framework生成”服务”应用程序,可通过”Windows 服务控制管理器”(Service Control Manager,SCM)来控制这些服务
7. 数据库存储过程 可以用.NET Framework写存储过程
8. 组件库 .NET Framework允许生成独立的程序集(组件)
FCL将相关的一组类型放到一个单独的命名空间中。
例如System命名空间,所有应用程序都要使用来自System命名空间的类型,所有类型(包含用于整数、字符、字符串、异常处理以及控制台I/O的类型等)最终都是从Object基类型派生的.
部分常规的FCL命名空间:
System: 包含每个应用程序都要用到的所有基本类型
System.Data: 包含用于数据库通信以及处理数据的类型
System.IO: 包含用于执行I/O以及浏览目录/文件的类型
System.Net: 包含进行低级网络通信,并于一些常用Internet协议协作的类型
System.Runtime.InteropServices: 包含允许托管代码访问非托管操作系统平台功能的类型(如COM组件以及Win32或定制DLL中的函数)
System.Security: 包含用于保护数据和资源的类型
System.Text: 包含处理各种编码方式(如ASC|| 和Unicode)的文本的类型
System.Threading: 包含用于异步操作和同步资源访问的类型
System.Xml: 包含用于处理XML架构(XML Schema)和数据的类型
1.7通用类型系统
CLR是完全围绕类型展开的,所以Microsoft指定了一个正式的规范,叫”通用类型系统”(Common Type System,CTS),它描述了类型的定义和行为.
CTS规范规定,一个类型可以包含零个或多个成员:
1. 字段(Field) 一个数据变量,是对象状态的一部分,根据名称和类型来区分
2. 方法(Method) 一个函数,能针对对象执行操作,通常会改变对象的状态.方法有一个名称、一个签名以及一个或多个修饰符
3. 属性(Property) 对于调用者,像是一个字段.对伊类型的实现者,像是一个方法(或者两个方法,成为getter和setter,或者称为取值方法和复制方法),可利用属性创建只读或只写的”字段”
4. 事件(Event) 事件在对象以及其他相关对象之间实现了一个通知机制,如按钮的事件,被单击之后通知其他对象
CTS指定了类型可视性规则以及类型成员的访问规则:
1. private 成员只能由同一个类类型中的其他成员访问
2. family(protected) 成员可由派生类型访问,不管是否在同一个程序集中
3. family and asscmbly 成员只能由在同一个程序集中的派生类型访问(C#和Visual Basic不提供)
4. assembly(internal) 成员可由同一个程序集的任何代码访问
5. family or assembly(protected internal) 成员可由任何程序集中的派生类访问.
6. public 成员可由任何程序集中的任何代码访问
注:括号部分为c#
“代码的语言”可以不同,但”代码的行为”都是完全一致的,因为最终是由CLR的CTS来定义类型的行为.
System.Object类型允许做下面的事情:
1. 比较两个实例的相等性
2. 获取实例的哈希码
3. 查询一个实例的真正类型
4. 执行实例的按位拷贝
5. 获取实例对象的当前状态的一个字符串表示
1.8公共语言规范
Microsoft定义了一个”公共语言规范”(Common Language Specification,CLS),它详细定义了一个最小功能集,任何编译器生成的类型要想兼容于由其他”符合CLS、面向CLR的语言”所生成的组件,就必须支持这个最小功能集.
將[assembly:CLSComplicant(true)]这个attribute应用于程序集,attribute告诉编译器检查public类型,判断是否存在任何不合适的构造,阻止了从其他编程语言中访问该类型.
//告诉编译器检查CLS相容性
[assembly:CLSComplicant(true)]
Namespace SomeLibrary{
}
1.9 与非托管代码的互操作性
CLR支持三种互操作情形:
1. 托管代码能调用DLL中的以恶搞非托管函数 托管代码可以采取一种名为P/Invoke(Platform Invoke)的机制来调用DLL中包含的函数.FCL中定义的许多类型都要在内部调用从Kernel32.dll、User32.dll等导出函数.例如,C#应用程序可调用Kernel32.dll导出的CreateSemaphore函数
2. 托管代码可使用现有的COM组件(服务器) 利用来自非托管COM组件的类型库,可创建一个托管程序集来描述COM组件,托管代码可以像访问其他任何托管类型一样访问托管程序集中的类型.
3. 非托管代码可使用托管类型(服务器) 使用托管代码可以更简单地实现非托管代码要求提供的COM组件,这就避免了所有代码都不得不喝引用计数以及接口打交道.例如,可以使用C#来创建一个ActiveX空间或者一个shell扩展.