我们知道,程序集对一个项目来说,是非常重要的,我们在做
一个项目的时候,会用到很多的命名空间,甚至会引入第三方的,这样,
我们就可以不需要再去写一些通用的类或方法了,而这些通用的类或方法
,通常就是放到了一个程序集中间了。当然,我们也可以自己定义一些类
或方法,这就需要我们自己去定义一个类库,然后生成一个程序集,也就
是我们通常说的类库了。
 但是,这样的类库,当我们引用的时候,就会自动的添加到
Debug中了,当我们用到这个程序时,就要把应用程序和这个程序集放在
一起才行,说到这,你也许就该说了,我们能不能把这个程序集直接注册
到操作系统中,这样,不管我们的应用程序放到哪里,我们都可以运行。
答案是肯定的,要解决这个问题,我们还是先来看看什么事程序集吧!
 程序集是.NET Framework应用程序的构造块;程序集构成了部
署、版本控制、重复使用、激活范围控制和安全权限的基本单元。程序集
是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻
辑功能单元。程序集向公共语言运行库提供了了解类型呢实现所需要的信
息。对于运行库,类型不存在于程序集上下文之外。
 程序集重要解决了版本控制问题和最终解决DLL冲突。程序集分
为两种:强命名程序集和弱命名程序集。这两种程序集在结构上是相同的
,组成有:程序集清单,类型元数据,MSIL代码,资源。程序集清单可以
存储在具有 Microsoft 中间语言 (MSIL) 代码的 PE 文件(.exe 或 .dll)中
,也可存储在只包含程序集清单信息的独立 PE 文件中。
 程序集由程序集名称、版本号、区域性和强名称信息这四部分
构成了一个唯一的标识。值得说明的是强名称信息,这个就是强、弱命名
程序集的标志。如果是强命名程序集的话,这个字段里会放一个公钥,这
样,我们就可以将这个程序集部署为全局的(一个程序集可以采取两种方
式布署:私有部署或全局部署),这个时候,我们就可以解决上面所说的
问题了。
 下面就说一下强命名程序集是怎么部署的。首先,在类库名的
属性中,找到签名,在这里,为该类库创建一个签名。然后,找到该类库
的dll文件,将这个dll文件拖到C:\Windows\assembly中(只能拖,不能赋
值,这里放的都是系统的程序集),然后,再将这个dll文件复制到C:
\Windows\Microsoft.NET\Framework\v2.0.50727,就是你的VS的安装
目录下,之后,就可以引用了。
 程序集中还有一个比较特殊的——友元程序集:可以从一个程
序集访问另一个程序集中的内部类型或内部成员。友元程序集功能用于访
问内部成员;私有类型和私有成员仍然不可访问。若要使程序集(程序集
B)能够访问另一个程序集(程序集 A)的内部类型和成员,应使用程序集
A 中的 InternalsVisibleToAttribute 属性
 下面是一个例子:
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo(“ClassDemo”)]//通过这个特性来说明本
程序集的友元程序集的名称。
namespace TessDll
{
    class Class1
    {
    }
    public class Class2
    {
    }
    internal class Class3
    {//这里定义了三种类型的,其目的是要说明,友元程序集只支
持//internal类型的。
        internal int i = 100;
        protected int j = 200;
        private int k = 300;
    }
}
调用:
using TessDll;
namespace ClassDemo
{
  internal  class Program
    {
        static void Main(string[] args)
        {
            Class3 c3 = new Class3();
            Console.WriteLine(c3.i);//这里只能访问到internal类型的
        }
     }
}