.Net程序集的要点(zhuan)

 

1. 程序集由程序集元数据、类型元数据、中间语言代码和资源构成。其中程序集元数据的一个重要组织部分是程序集清单,
   它描述了本程序集和引用该程序集所需要的所有信息,并列出了所有的依赖关系。清单由以下部分组成:
    (1).标识(名称、版本、文化和公钥)。公钥用于惟一地标识程序集。
    (2).属于该程序集的一个文件列表。一个程序集可以拥有一到无数个文件。
    (3).该程序集引用的程序集的列表。在程序集清单中说明了在程序集中使用的所有程序集,以及它们的版本号和公钥。
    (4).一组许可请求---运行该程序集需要的许可。
    (5).导出的类型,这些类型是在程序集引用的模块中定义的。
2. 在一个程序集中可以有不同的命名空间,一个命名空间也可以分布在多个程序集中。
3. 程序集分为私有程序集和共享程序集。在引用私有程序集时,如果程序集是个exe文件,不能用添加引用的方式引用它,
    应该把它手动拷贝到目标目录下。如果是.dll文件可以使用添加引用的方式,引用之后系统会自动在目标目录下创建该程序集的副本,
    无需手动拷贝。对于共享程序集,则需要将其安装到全局程序集缓存中,gacutil.exe工具可以在安装程序的脚本中调用。
    另外,如果查看全局程序集缓存,可以打开C:\Windows\Assembly文件夹查看。
    gacutil /l 显示全局程序集缓存中的所有程序集。
    gacutil /i mydll 把共享程序集mydll安装到全局程序集缓存中。
    gacutil /u mydll 卸载mydll程序集。
    引用共享程序集的方法和引用私有的dll程序集的方式是一样的,只是系统不会再把dll的副本拷贝到你的目标目录下,
    而是从程序集缓存中加载该程序集。
4.程序集的强名
    共享程序集最关键的是要有一个全局惟一的名称,这个名称在.NET中叫做强名。强名由以下部分组成:
    (1).程序集本身的名称
    (2).版本号。有了版本号,可以同时使用同一个程序集的不同版本。不同的版本可以同时存在,并可以同时加载到同一个进程上。
    (3).公钥,它可以保证强名称的独一无二。它也可以保证引用的程序集不会被篡改或代替。
    (4).文化。
    创建强名文件:
    在命令行使用sn –k mykey.snk 就可以生成一个公钥/私钥对,并把它存到snk文件中。
    私钥用来为组件进行数字签名,公钥被引用该程序集的程序验证该程序集时使用。同时,公钥也成为了程序集强名的一部分。
    具有强名的程序集,通过ildasm反编译工具查看时,可以在程序集清单中看到这个公钥。

5. 关于服务器组件(Enterprise Services)
    (1).服务组件需要有强名称。
    (2).应当在"全局程序集缓存"(GAC) 中注册服务组件,因为这些组件是系统级别的资源。服务器应用程序要求安装在 GAC 中,
    库应用程序则不要求这样(但是建议安装在 GAC 中)。
    (3).您可以通过延迟注册自动向 COM+ 注册服务组件,也可以通过 Regsvcs.exe 实用工具手动注册。
    自动注册(部署):
    如果启动了使用服务组件的.NET客户应用程序,就会自动配置COM+应用程序。所有派生于ServicedComponent的类都是这样。
自动部署的一个重要的缺点是,在自动部署时,客户应用程序需要有管理权限。如果客户应用程序是ASP.NET应用程序,
ASP.Net运行库一般没有管理权限。所以自动部署仅用于开发阶段。因此,对于开发阶段来说,这带来了很大方便,在每次创建了
服务组件之后,都不用手动部署。
    手工注册(部署):
    使用命令:regsvcs SimpleServer.dll就可以把程序集SimpleServer注册为一个COM+应用程序。

 

程序集是 .NET 框架应用程序的主要构造块。它是一个功能集合,并以单个实现单元(一个或多个文件)的形式生成、版本化和部署。所有托管类型和资源或者只在其实现单元中标记为可访问,或者在该单元外由代码标记为可访问。
程序集通过其清单(每个程序集不可缺少的部分)进行自我描述。
    建立程序集标识(以文本名称的形式)、版本、区域性和数字签名(如果程序集将在应用程序间共享)。
定义组成程序集实现的文件(按名称和文件散列)。
指定组成程序集的类型和资源,包括从程序集导出的类型和资源。
逐条列出其他程序集上的编译时依赖项。
指定程序集正确运行所需的权限集

命名空间名称和程序集名称之间的差异是什么?
    命名空间是类型的逻辑命名方案,此方案中简单的类型名称(如 MyType)用以点分隔的分层名称开头。这样的命名方案完全受开发人员控制。例如,类型 MyCompany.FileAccess.A 和 MyCompany.FileAccess.B 可能在逻辑上应具有与文件访问相关的功能。.NET 框架使用分层命名方案将类型分为相关功能(例如 ASP.NET 应用程序框架)或远程处理功能的逻辑类别。设计工具可以利用命名空间使开发人员在代码中浏览和引用类型更容易。命名空间的概念与程序集的概念无关。单个程序集可以包含分层名称具有不同命名空间根的类型,而逻辑命名空间根可以跨越多个程序集。在 .NET 框架中,命名空间是逻辑设计时命名便利,而程序集在运行时建立类型的名称范围

什么是专用程序集和共享程序集?
    专用程序集仅由单个应用程序使用,并存储在该应用程序的安装目录中(或其中的子目录中)。共享程序集是一个可以由多个应用程序引用的程序集。为了共享程序集,必须给予该程序集一个加密的强名称(有时又称强名称),为此目的显式生成程序集。相比之下,专用程序集名称只需在使用它的应用程序中是唯一的。
通过区分专用程序集和共享程序集,我们以显式决策的形式引入共享概念。只需将专用程序集部署到应用程序目录,即可保证该应用程序只与用来生成和部署它的位一起运行。对专用程序集的引用只被本地解析到专用应用程序目录。
   可以举出多个生成和使用共享程序集的理由,如表示版本策略的能力。共享程序集有一个加密的强名称,这意味着只有此程序集的作者具有产生程序集新版本的密钥。因此,如果您生成一个策略语句,表明自己希望接受程序集的新版本,则应确信版本更新将受作者的控制和验证。否则,您不必接受它们。
    对于本地安装的应用程序,共享程序集通常被显式安装到全局程序集缓存中(由 .NET 框架维护的程序集的本地缓存)。.NET 框架版本管理功能的关键是:下载的代码不影响本地安装的应用程序的执行。下载的代码放置在特殊的下载缓存中,并且在计算机上不是全局可用的,即使以共享程序集的形式生成了某些下载组件。
.NET 框架随附的类均以共享程序集的形式生成。
形象的举例:
        如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型。(摘抄自《精通.NET核心技术--原来与架构》   电子工业出版社)  
  例如我们要用A类,则需要把包含A类的程序集(即*.DLL)引用到该工程中(物理);而在程序中要声明A类的命名空间(逻辑)。
      程序集就是程序的集合啊,可以理解为一个项目中的一堆程序,一般一个项目是一个程序集,在项目中右键属性里面可以设置程序集的名字。(理解成dll或exe也差不多)  
      程序集也不是物理组织的,例如:一个文件可以包含多个程序集,一个程序集也可以分成几个文件。
      名称空间是类型的一种逻辑命名方案,其中简单类型名称(如   MyType)前面带有用点分隔的层次结构名称。这样的命名方案完全在开发人员的控制之下。例如,键入   MyCompany.FileAccess.A   和   MyCompany.FileAccess.B   在逻辑上将会具有与文件访问相关的功能。.NET   框架使用一种层次结构命名方案,用于将类型按相关功能的逻辑类别进行分组,例如,ASP.NET   应用程序框架或远程处理功能。设计工具可以利用名称空间使开发人员更容易在代码中浏览和引用类型。名称空间的概念与程序集的概念之间没有任何联系。一个程序集可以包含其层次结构名称具有不同名称空间根的类型,而一个逻辑名称空间根可以跨越多个程序集。在   .NET   框架中,名称空间是在设计时进行逻辑命名的便捷方式,而程序集在运行时为类型建立名称作用域。

posted @ 2009-09-20 23:19  pursue  阅读(495)  评论(0编辑  收藏  举报