请先关注 [低调大师] 公众号 优秀的自媒体个人博客,低调大师,许军

低调大师

您现在的位置是:首页>文章详情

文章详情

《.Ne框架程序设计》随记(3)

2017-12-26 23热度
 以往,每个应用程序进程都有自己的虚拟地址空间,通过地址空间的隔离来保证一个进程不会干扰另一个进程的运行。但通过验证托管代码,可以确保不会访问不该访问的内存,因此可以一个单独的虚拟地址空间内运行多个托管应用程序。由于太多的进程会占用过多的系统资源,损伤系统性能,并限制系统可用的资源。因此在一个进程中运行多个托管应用程序可以减少进程的数量,提高系统性能,降低资源需求,而同时应用程序仍然可以保持良好的健壮性。

       CLR中,一个托管应用程序叫一个应用程序域(AppDomain)。默认地,一个托管exe仅仅执行在它自己拥有的地址空间中(这个地址空间只含有一个应用程序域),但CLR 的宿主进程(如IIS服务器等)可以决定在一个操作系统进程中运行多个应用程序域。

       .net framework提供了一组丰富的类库(FCL),其中含有几千个类型的定义。CLR 和FCL使开发者可以创建以下应用程序:(1)XML Web服务;(2)Web窗体;(3)windows窗体;(4)控制台应用程序;(5)windows服务:windows服务控制管理器(SCM)控制的服务程序;(6)组件库;

       CLR支持三种互操作:

(1) 托管代码调用DLL中的非托管函数。托管代码可以使用一种叫P/Invoke(就是平台调用)的机制来调用DLL中的函数。实际上,许多FCL中定义的类型内部都调用了从Kernel32.dll,User32.dll等DLL中导出的函数。例如,C#程序可以调用从Kernel32.dll中导出的CreateSemaphore函数。

(2) 托管代码使用现存的COM组件(非托管组件作为COM服务器)。利用现有的COM组件的类型库,我们可以创建出描述它们的托管程序集,托管代码可以象访问其他托管代码一样访问这些托管程序集中的类型。有时候没有类型库,我们可以在代码中创建自己的类型,CLR可以用这些类型进行正确的互操作,例如,可以在C# 应用程序中使用DirectX COM 组件。

(3)  非托管代码使用托管类型(托管类型作为COM服务器)。许多现存的非托管代码都需要提供COM组件才能正常运行。而用托管代码来实现这些组件更容易,因为这样可以避免处理引用计数和COM接口。例如,可以用C#来创建ActiveX控件或者shell扩展程序。



#include <stdio.h>
#include <mscorlib.dll>
using namespace System;

void main()
{
printf("Hello,");
Console::WriteLine("World!");
}


       在安装新的应用程序时却损坏了现有的应用程序,这叫“Dll hell”.现在大多数应用程序的安装都会影响系统的各个部分。例如,会复制许多文件到许多目录中,更新注册表设置,安装快捷键到桌面,开始菜单和快速启动中。这就是备份应用程序比较困难,因为必须复制所有的文件和相关的注册表内容,而要将应用程序移植到另外一抬机器也很困难,必须 重新安装。最后,卸载应用程序也很麻烦。.net framework使组件不再需要象COM那样在注册表中进行注册。它还包含了一个叫代码访问安全的安全模型,这是基于程序集的标识来控制的。

       一个托管PE文件包含4部分:PE表头,CLR表头,元数据和IL代码。PE表头是系统要求的标准信息。CLR表头专用于那些需要CLR 才能运行的模块(托管模块)。CLR表头中包含和模块一起创建的元数据的主版本号和次版本号,一些标记,若模块是CUI或GUI,可执行文件还有一个标识入口点方法的MethodDef标记,以及一个可选的强命名数字签名。该表头还包括模块内某些元数据表的大小和偏移量。

       元数据实际是一块二进制数据,其中包含一些表,可以分为3类:定义表,引用表,清单表。程序集中包含了一个文件用于保存清单(manifest).清单是另外一组元数据的集合,其中主要包含了程序集中一部分文件的名称,还描述了程序集的版本,语言文化,发布者,公有导出类型,以及组成程序集的所有文件。CLR总是先加载包含清单元数据的文件,然后利用该清单来获取程序集中的其他文件。程序集的特性:1)定义了可重用的类型。2)程序集标识有一个版本号。3)可以包含与之相关的安全信息。

       可以在应用程序的配置文件中指定一个codeBase元素来配置程序需要下载的程序集文件。codeBase元素标识了一个可以找到程序集所有文件的URL地址。当尝试加载一个程序集的文件时,CLR首先获取codeBase元素的URL地址,然后检查本地机器的下载缓存看是否已经存在该文件,若存在,该文件就被加载,否则,CLR将codeBase元素的URL地址中将该文件下载到缓存,若找不到该文件,CLR将在运行时抛出FileNoFoundException异常。

       程序集是一个可重用,可实施版本策略和安全策略的单元,它允许我们将类型和资源划分到不同的文件中,这样程序集的使用者就可以决定将哪些文件打包在一起部署,一旦CLR加载了程序集中包含清单的那个文件,就可以确定程序集的其他文件中包含了程序正在引用的类型和资源,任何程序集的使用者只需要知道包含清单的文件名称,文件的划分对使用者是透明的,并且可以在将来改变,同时又不会破坏现有应用程序的行为。

    对于可执行应用程序(exe),配置文件必须位于应用程序的基目录中,并且它的名字必须是exe文件名再加.config扩展名。对于asp.net web窗体和xml web服务应用程序,配置文件必须位于 web应用程序的虚拟根目录下,并且名称总是web.config.另外,子目录也可以包含它们自己的web.config文件,并继承上一目录的配置设置。配置设置可以用于特定的应用程序,也可以用于整个机器。

       强命名程序集有一个发布者的公钥/私钥对签名,其中公钥/私钥对唯一地标识了程序集的发布者,利用公钥/私钥对,我们可以对程序集进行唯一的标识,实施安全策略和版本策略。一个程序集有两种部署方式:私有方式和全局方式。私有方式将程序集部署在应用程序的基目录及其子目录下。弱命名程序集只能够进行私有部署。全局方式将程序集部署在一些CLR确知的地方,当CLR搜索程序集时,它就到这些地方去找。强命名程序集即可以进行私有部署,也可以进行全局部署。一个强命名程序集包含四个唯一标识程序集的特性:文件名(没有扩展名),版本号,语言文化标识,和一个公有密钥标记(由公有密钥产生的一个值)。若想唯一标识一个程序集,就必须首先获取一个公钥/私钥对,再将公钥/私钥对与程序集相关联。

       CLR能够将名称相同但路径不同的多个文件加载到同一个地址空间,这叫“并存执行”,这是解决”Dell hell”的一个关键技术。在解析一个被引用的类型时,CLR可以在下面三个地方之一找到该类型:(1)同一个文件。对同一个文件中类型的访问在编译时就确定了。CLR直接从该文件中加载被引用的类型。(2)不同的文件,相同的程序集。(3)不同的文件,不同的程序集。当被引用的类型在一个不同的程序集文件中时,CLR会首先加载包含被引用程序集的清单所在的文件。若该文件没有包含需要的类型,CLR则会根据此清单文件加载适当的文件.




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/09/01/491831.html,如需转载请自行联系原作者
收藏 (0)

相关文章

    文章评论

    共有0条评论来说两句吧...