.net程序集(网上收集)

=======================================================================

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

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


什么是专用程序集和共享程序集?
专用程序集仅由单个应用程序使用,并存储在该应用程序的安装目录中(或其中的子目录中)。共享程序集是一个可以由多个应用程序引用的程序集。为了共享程序集,必须给予该程序集一个加密的强名称(有时又称强名称),为此目的显式生成程序集。相比之下,专用程序集名称只需在使用它的应用程序中是唯一的。
通过区分专用程序集和共享程序集,我们以显式决策的形式引入共享概念。只需将专用程序集部署到应用程序目录,即可保证该应用程序只与用来生成和部署它的位一起运行。对专用程序集的引用只被本地解析到专用应用程序目录。
www.w3sky.com
可以举出多个生成和使用共享程序集的理由,如表示版本策略的能力。共享程序集有一个加密的强名称,这意味着只有此程序集的作者具有产生程序集新版本的密钥。因此,如果您生成一个策略语句,表明自己希望接受程序集的新版本,则应确信版本更新将受作者的控制和验证。否则,您不必接受它们。
对于本地安装的应用程序,共享程序集通常被显式安装到全局程序集缓存中(由 .NET 框架维护的程序集的本地缓存)。.NET 框架版本管理功能的关键是:下载的代码不影响本地安装的应用程序的执行。下载的代码放置在特殊的下载缓存中,并且在计算机上不是全局可用的,即使以共享程序集的形式生成了某些下载组件。
.NET 框架随附的类均以共享程序集的形式生成。

形象的举例:
        如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型。(摘抄自《精通.NET核心技术--原来与架构》   电子工业出版社)  
   
  例如我们要用A类,则需要把包含A类的程序集(即*.DLL)引用到该工程中(物理);而在程序中要声明A类的命名空间(逻辑)。 
      程序集就是程序的集合啊,可以理解为一个项目中的一堆程序,一般一个项目是一个程序集,在项目中右键属性里面可以设置程序集的名字。(理解成dll或exe也差不多)   
      程序集也不是物理组织的,例如:一个文件可以包含多个程序集,一个程序集也可以分成几个文件。
      名称空间是类型的一种逻辑命名方案,其中简单类型名称(如   MyType)前面带有用点分隔的层次结构名称。这样的命名方案完全在开发人员的控制之下。例如,键入   MyCompany.FileAccess.A   和   MyCompany.FileAccess.B   在逻辑上将会具有与文件访问相关的功能。.NET   框架使用一种层次结构命名方案,用于将类型按相关功能的逻辑类别进行分组,例如,ASP.NET   应用程序框架或远程处理功能。设计工具可以利用名称空间使开发人员更容易在代码中浏览和引用类型。名称空间的概念与程序集的概念之间没有任何联系。一个程序集可以包含其层次结构名称具有不同名称空间根的类型,而一个逻辑名称空间根可以跨越多个程序集。在   .NET   框架中,名称空间是在设计时进行逻辑命名的便捷方式,而程序集在运行时为类型建立名称作用域。 

========================================================================

程序集是 .NET 框架应用程序的主要构造块。它是作为一个单一实现单元(包含一个或多个文件)来创建、标识和部署的功能集合。所有的托管类型和资源都可以被标记为仅在其实现单元内访问,或者标记为可由该单元以外的代码来访问。

  程序集通过清单来进行自我说明。清单是每个程序集的不可或缺的组成部分。清单:

  建立程序集标识(以文本名称的格式)、版本、类别和数字签名(如果要在应用程序之间共享该程序集)。


  定义组成程序集实现的文件(通过名称和文件散列)。

  指定组成程序集的类型和资源,包括哪些是从程序集中导出的。

  逐条记录编译时对其他程序集的依存。

  指定程序集正确运行所需要的权限的集合。
  此信息在运行时用于解析引用、强制版本绑定策略以及验证所加载的程序集的完整性。因为每一类型都被加载到程序集的上下文中,所以运行时可以确定并定位任何正在运行的对象的程序集。程序集也是应用了代码访问安全权限的单元。在确定授予其所包含的代码哪些权限时,每个程序集的标识证据都被认为是独立的。

  程序集的自我说明特征也有助于实现无影响安装和 XCOPY 部署。

  什么是专用程序集和共享程序集?
  专用程序集仅由单一应用程序使用,并且存储在该应用程序的安装目录中(或其子目录中)。共享程序集是可被多个应用程序引用的程序集。要共享一个程序集,该程序集必须明确为这个目的而创建,这可以通过给其指定加密的增强型名称(用作共享名称)来实现。相反,专用程序集名称只要求在使用它的应用程序中是唯一的。

  通过区分专用和共享程序集,我们介绍明确决定共享的要点。只需简单地将专用程序集部署在应用程序目录中,即可确保应用程序只在创建和部署它的那部分中运行。对专用程序集的引用只在专用应用程序目录内部进行解析。

  选择创建和使用共享程序集可以有多种原因,例如表达版本策略的能力。共享程序集具有加密的增强型名称,这项事实意味着只有程序集的作者才拥有密钥来生成程序集的新版本。因此,如果您做出策略声明,希望接受程序集的新版本,则您可以确信版本更新将由作者来控制和验证。否则,您就不会接受它们。

  对于在本地安装的应用程序,共享程序集通常被明确安装在全局程序集缓存中(程序集的本地缓存由 .NET 框架维护)。.NET 框架的版本管理特性的关键在于下载的代码不会影响本地安装的应用程序的执行。下载的代码被放在一个特殊的下载缓存中,即使某些下载组件被编译为共享程序集,也不能在机器上全局使用这些代码。

  与 .NET 框架一起发布的类都被编译为共享程序集。


==============================================================================

作为一个单元进行版本控制和部署的一个或多个文件的集合。程序集是 .NET Framework 应用程序的主要构造块。所有托管类型和资源都包含在某个程序集内,并被标记为只能在该程序集的内部访问,或者被标记为可以从其他程序集中的代码访问。程序集在安全方面也起着重要作用。代码访问安全系统使用程序集信息来确定为程序集中的代码授予的权限集。

程序集是 .NET Framework 编程的基本组成部分。程序集执行以下功能:

1.包含公共语言运行库执行的代码。如果可移植可执行 (PE) 文件没有相关联的程序集清单,则将不执行该文件中的 Microsoft 中间语言 (MSIL) 代码。请注意,每个程序集只能有一个入口点(即 DllMain、WinMain 或 Main)。

程序集形成安全边界。程序集就是在其中请求和授予权限的单元。有关应用于程序集的安全边界的更多信息,请参见程序集安全注意事项。

2.程序集形成类型边界。每一类型的标识均包括该类型所驻留的程序集的名称。在一个程序集范围内加载的 MyType 类型不同于在其他程序集范围内加载的 MyType 类型。

3.程序集形成引用范围边界。程序集的清单包含用于解析类型和满足资源请求的程序集元数据。它指定在该程序集之外公开的类型和资源。该清单还枚举它所依赖的其他程序集。

4.程序集形成版本边界。程序集是公共语言运行库中最小的可版本化单元,同一程序集中的所有类型和资源均会被版本化为一个单元。程序集的清单描述您为任何依赖项程序集所指定的版本依赖性。

5.程序集形成部署单元。当一个应用程序启动时,只有该应用程序最初调用的程序集必须存在。其他程序集(例如本地化资源和包含实用工具类的程序集)可以按需检索。这就使应用程序在第一次下载时保持精简。

6.程序集是支持并行执行的单元。有关运行多个程序集版本的更多信息,请参见程序集和并行 (side-by-side) 执行。

程序集可以是静态的或动态的。静态程序集可以包括 .NET Framework 类型(接口和类),以及该程序集的资源(位图、JPEG 文件、资源文件等)。静态程序集存储在磁盘上的可移植可执行 (PE) 文件中。您还可以使用 .NET Framework 来创建动态程序集,动态程序集直接从内存运行并且在执行前不存储到磁盘上。您可以在执行动态程序集后将它们保存在磁盘上。

有几种创建程序集的方法。您可以使用过去用来创建 .dll 或 .exe 文件的开发工具,例如 Visual Studio .NET。您可以使用在 .NET Framework SDK 中提供的工具来创建带有在其他开发环境中创建的模块的程序集。您还可以使用公共语言运行库 API(例如 Reflection.Emit)来创建动态程序集。

================================================================================

程序集(assembly)是包含编译好的、面向.NET Framework的代码的逻辑单元。程序集是完全自我描述性的,也是一个逻辑单元而不是物理单元,它可以存储在多个文件中(动态程序集的确存储在内存中,而不是存储在文件中)。如果一个程序集存储在多个文件中,其中就会有一个包含入口点的主文件,该文件描述了程序集中的其他文件。

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

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

注意:

ildasm是一个基于Windows的实用程序,可以用于检查程序集的内容,包括程序集清单和元数据。第15章将介绍ildasm

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

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

程序集有两种类型:共享程序集和私有程序集。

1.4.1 私有程序集

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

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

用户一般会希望把商用软件安装在它自己的目录下,这样软件包没有覆盖、修改或加载另一个软件包的私有程序集的风险。私有程序集只能用于自己的软件包,这样,用户对什么软件使用它们就有了更多的控制。因此,不需要采取安全措施,因为这没有其他商用软件用某个新版本的程序集覆盖原来的私有程序集的风险(但软件是专门执行怀有恶意的损害性操作的情况除外)。名称也不会有冲突。如果私有程序集中的类正巧与另一个人的私有程序集中的类同名,是不会有问题的,因为给定的应用程序只能使用私有程序集的名称。

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

1.4.2 共享程序集

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

       名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名。因为客户机代码理论上可以同时访问这些程序集,所以这是一个严重的问题。

       程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户机代码不兼容。

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

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

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

1.4.3 反射

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

posted @ 2008-01-27 15:36  IamV  阅读(782)  评论(0编辑  收藏  举报