元数据:.NET框架的基石
元数据描述了一个类型的字段和方法。元数据使得一种语言开发的类型可以被另一种完全不同的语言所使用。垃圾收集器也使用了元数据来确定哪些对象是可达的------元数据指出了一个对象中引用了那些对象。元数据还用来帮助执行对象序列化和反序列化(C#圣经读书笔记---CLR对象序列化(object serialization)),从而允许将它们存储在磁盘上或者在网络上传送。
使用ILDASM.exe可以查看程序集的元数据。然后将其中的信息以可读的格式显示出来。查看元数据的行为其实就是一个反射的过程,ILDASM.exe说做的事情就是对一个模块或者程序集中的元数据执行反射,然后将结果显示给用户。
CLR寄宿
.net框架运行在微软Windows平台之上。这意味着.NET框架必须使用Windows可以理解的技术来改造。这首先体现在所有的托管模块和程序集文件都必须使用Windows PE文件格式,其或者未一个Windows EXE文件,或者未一个动态连接库(DLL)文件。
在开发CLR时,微软实际上是将其作为一个COM服务器实现在了一个DLL内。也就是说,微软为CLR定义了一个标准的COM接口,并且为该接口和COM服务器分配了GUID。当安装.NET框架时,表示CLR的COM服务器就像其他COM服务器一样被注册到了Windows的注册表里面。任何Windows应用程序都可以寄宿CLR.(CLR寄宿搞不明白啊)
应用程序域
当CLR COM服务器被加载到一个Windows进程中时,它便开始执行初始化。初始化的部分工作就是创建一个托管堆,该托管堆将用于分配所有的引用对象、以及对他们执行垃圾收集。另外CLR还会创建一个可被加载到当前进程中所有托管类型使用的线程池。在进行这些初始化工作的同时,CLR还会创建一个应用程序域(AppDomain)。一个应用程序域是一组程序集的逻辑容器。CLR初始化时创建的第一个程序域称作默认程序域(default appDomain),该应用程序域只有在Windows进程被中断时才会被销毁。
除了默认的应用程序域,一个宿主还可以指示CLR创建额外的应用程序域,另外托管程序集中的代码也可以告诉CLR创佳额外的应用程序域。应用程序域有三个有用特点:
- 应用程序域之间是隔离的;
- 应用程序域可以被卸载;
- 应用程序域可以单独实施安全策略和配置策略
ASP.NET Web窗体和XML Web服务应用程序
ASP.NET是一个ISAPI DLL(实现与 ASPNET_ISAPI.DLL中)。当客户端请求一个由ASP.NET ISAPI DLL处理的URL时,ASP.NET会创建一个工作者进程(worker process)(ASPNET_wp.exe)。工作者进程是一个寄宿有CLR COM服务器的Windows进程。
当客户端向一个Web应用程序发出一个请求时,ASP.NET会判断该请求是否为第一次。如果是ASP.NET会告诉CLR为该Web程序创建一个新的应用程序(每个应用程序可以由它的虚拟目录来判定)。ASP.NET然后告诉CLR将必要的程序集(其中包含着组成该Web应用程序的类型)加载到新建的应用程序域中,并创建一个Web应用程序类型的实例,调用其中方法响应客户端请求,随着Web应用程序的运行,如果代码中引用到了更多类型,CLR会继续将必要的程序集加载到当前Web应用程序的应用程序域中。
当更多的客户端向一个已经运行的Web应用程序发出请求时,ASP.NET不会再去创建新的应用程序域,相反,它会使用现有的应用程序域,创建一个新的Web应用程序类型的实例,并调用其中的方法。这些方法以及被JIT编译成了本地代码,所以后续客户端的请求处理性能将会有所提高。
终于明白了,Web请求时的应用程序域