我们知道,程序集对一个项目来说,是非常重要的,我们在做一个项目的时候,会用到很多的命名空间,甚至会引入第三方的,这样,我们就可以不需要再去写一些通用的类或方法了,而这些通用的类或方法,通常就是放到了一个程序集中间了。当然,我们也可以自己定义一些类或方法,这就需要我们自己去定义一个类库,然后生成一个程序集,也就是我们通常说的类库了。
但是,这样的类库,当我们引用的时候,就会自动的添加到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类型的
}
}
}
转载于:https://blog.51cto.com/lzhp924/369209