原文地址:http://blog.csdn.net/yanglaiwang/article/details/5470389(原文上带图)
一、 程序集定义
由.NET 编译生成的EXE文件或DLL文件就是程序集,例如:System.Data.dll。
二、 程序集结构
1. 程序集清单:和我们在淘宝买东西的配送清单一样就是说明里面包含了什么东东。
2. 类型元数据:类型元数据是描述程序集中定义的类型的信息,由一些元数据表组成,包含 类、方法、属性、参数、返回值等。
3. MSIL代码:每一种类型的二进制代码,这些代码存储为与机器无关的MSIL代码。
4. 资源:程序的不可执行部分,比如图片等。
三、 查看程序集
在工具菜单下-外部工具-添加
标题输入Ildasm(中间语言反汇编程序)
命令选择:C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/ildasm.exe然后选择刚才的Ildasm菜单-文件-选择你的DLL文件即可查看,结果如下图。
Manifest:就是程序集清单通过这个我们可以看出它引用外部的程序集等资源以及对自身模块的说明。.assembly extern mscorlib这样的说明是说明它对外部的引用。程序集自身的信息包括:程序集文化、版本号、版本属性、AssemblyVersion、版本兼容性。
四、 使用程序集
例如: 添加引用-选择DLL文件就是引用了程序集。
五、 私有和共享程序集
1. 私有程序集:私有程序集必须和应用程序在相同的目录下。默认的都是私有程序集。
2. 共享程序集:共享程序集存放在GAC(全局程序集高速缓存位于windows/assembly目录下,如下图)区,任何程序都可以引用它。
3. 强名:为了保护和区分不同的共享程序集(因为程序集有可能是多个人开发的但是名字一样),我们必须在共享程序集上加密钥。如果密钥不同即使两个组件的名称相同也不是同一组件。程序集名称+版本+公共密钥=强名
4. 如何创建共享的程序集?
我们通过-程序-Microsoft Visual Studio 2005-Visual Studio Tools-Visual Studio 2005 命令提示,执行sn.exe外部程序。
第一步、将目录转换到当前dll文件的目录下然后执行sn -k DLL文件名, 即如图通过以下命令生成一个密钥AssemblyT.snk。
第二步、选择当前项目-属性然后给项目选择密钥然后重新编译程序,如下图。
我们在通过Ildasm工具查看DLL文件的时候会发现已经签入了一个publickey密钥。
第三步、将新生成的AssemblyT.dll文件拖放到windows/assembly下我们既可以引用了。
第四步、我们建立个WEB程序调用一下。
using AssemblyT;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Oprator O = new Oprator();
Response.Write(O.Plus());
}
}
输出结果:3
六、 程序集的用途
1. 通过反射(类似我们上面用的Ildasm,反编译。 只不过反射是通过我们自己写代码来获取程序集信息的)动态的获取他的内容,如类、字段、方法等如: PetShop工厂模型里用的反射。
2. 通过反射获取Assemble的信息(语言、本版等)。
3. 开发组件或接口等。
注意:
一般来说一个命名空间就生成一个程序集,比如我们开发系统常用到的三层结构如果建立项目的时候选择默认的命名空间那么他们就是一对一的 WEB.DLL, BLL.DLL,DAL.DLL。但是它们不一定总是一对一的。一个命名空间可以生成多个程序集,而一个程序集也可以包含多个命名空间下的东西,它们没有必然的联系。