【CSharp】程序集

.NET程序的可执行文件称为程序集。程序集时编译好的、面向.NET Framework的代码的逻辑单元。

程序集是完全自描述性的,它是一个逻辑单元而不是物理单元,这意味着它可以存储在多个文件中(动态程序集存储在内存种,而不是存储在文件中)。如果一个程序集存储在多个文件中,其中就会由一个包含入口点的主文件,该文件描述了程序集中的其他文件。

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

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

由于程序集包含程序的元数据,因此调用给定程序集中的代码的应用程序或其他程序集不需要引用注册表或其他数据源就能确定如何使用该程序集。

私有程序集

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

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

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

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

共享程序集

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

  • 名称冲突,一个公司的共享程序集实现的类型与自己的共享程序集中的类型重名,客户端代码理论上可以同时访问这些程序集,所以这是个严重的问题。
  • 程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户端代码不兼容。

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

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

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

 

你可能感兴趣的:(CSharp)