什么是程序集

原文地址: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。但是它们不一定总是一对一的。一个命名空间可以生成多个程序集,而一个程序集也可以包含多个命名空间下的东西,它们没有必然的联系。

时间: 2024-10-11 07:21:24

什么是程序集的相关文章

SQL Server通过外部程序集注册正则表达式函数(CLR函数)

1.下载dll程序集(通过C#编写的支持正则的方法),百度网盘下载: 1.1如果只想用,可以直接下载MSSQLRegexExtend.dll https://pan.baidu.com/s/1qX8eHa8 1.2正则程序集对应的解决方案MSSQLRegexExtend.sln,已打包 https://pan.baidu.com/s/1qXZja9m 2.SQL Server数据库注册程序集 CREATE ASSEMBLY AssemblyRegex from 'D:\MSSQLRegexExt

《Inside C#》笔记(完) 程序集

程序集内部包含了各种相关的模块.资源文件.配置文件等,将这些在功能上相关的文件整合到单个文件中,以便于部署和维护.使用C#编译器编译程序时,生成的便是程序集. 一.清单数据 a)如果编译的是独立应用程序或是dll,清单数据会被保存在生成的PE文件中,这被称为单文件程序集:但如果是多文件程序集,清单数据会单独保存. b)清单数据包含的内容有:程序集的名称:版本信息:签名:文件:引用的程序集:类型:自定义Attribute:产品信息. 二.程序集的作用 a)将多个模块打包成程序集可以带来性能的提升,

为什么.Net平台不支持程序集卸载(Assembly.Unload)?

我们知道在.net平台中反射提供了在运行时动态的获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象.我们知道反射中可以通过System.Reflection.Assembly命名空间下的 Assembly.Load 动态的加载程序集信息,获取我们想要的一切信息.那么当我们动态加载完程序集并对其使用完之后,我们想卸载掉它,不想在内存中留下垃圾信息,这时我们发现Assembly并没有提供Assembly.Un

.NET 程序集Assembly使用

概述 一直以来,我们都在用C#编写程序,编写程序的时候,我们用到继承.多态.接口以及泛型,我们也都明白子类可以继承抽象类,并能够重写父类的抽象方法,可是大家是否想过,如下几个问题: 1.凡树必有根和叶,类的继承也如此,如何通过程序集查找所有继承父类的之类的程序集名称? 2.如果程序B被其他程序调用,如何通过程序集查询调用B的所有程序? 3.如何查询当前项目通过添加引用了哪些程序集? 带上上面的三个问题,我们来学习下.NET 程序集 Assembly. 查询继承父类的程序集合BaseType .N

未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件

连续两天都为这个运行时错误“类型初始值设定项引发异常”而烦恼,调试也不知道哪里出了问题.上网Google一下,一大堆相同的问题,可是按照那些方法折腾来折腾去,问题还是一样.最后在CSDN上发帖子问了,果然“重赏之下必有勇夫”,很快就有高手回复了,问题也随着解决了.哈哈.在此写个随笔,以后如果大家遇到类似问题,也可参考一下,自己也做个备忘,不然放在电脑上,又找不到,我的电脑文件到处乱放,有时连我自己都找不到^_^. 问题是这样嘀: 项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这

未能加载文件或程序集“DotNetOpenAuth.Core, Ve

“/”应用程序中的服务器错误. 未能加载文件或程序集“DotNetOpenAuth.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246”或它的某一个依赖项.系统找不到指定的文件. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.IO.FileNotFoundException: 未能加载文件或程

程序集=命名空间

命名空间是用来组织和重用代码的编译单元.如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了. 所谓namespace,是指标识符

.net 程序集的加载与反射

一. 程序集的加载: 在CLR内部使用System.Reflection.Assembly类的静态Load方法尝试加载程序集. //LoadFrom 根据已知的程序集路径加载程序集 Assembly a = Assembly.LoadFrom("@c://query.dll");

C# 动态加载程序集dll (实现接口)

一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface{    public interface ILyhInterface    {        void Run();    }} 二.程序集(实现接口的程序集):LyhClassLibrary1.dll, LyhClassLibrary2.dll,LyhClassLibrary3.dll,所有程序集引用:LyhInterface.dll namespace LyhClassLibrary1{

C#-VS程序集

程序集即代码组,可以是单个文件或多个文件,按一个整体部署,但可指定自身调用其他程序集的版本. 推出原因 为解决dll地狱而推出,也可解决其他问题.dll地狱,a应用使用dll版本1,b应用使用dll版本2,传统的com(一般用dll执行)模式,会自动调用最新版本的dll,如果这个dll不向后兼容(大多dll都不向后兼容),导致装了b应用后,a应用不能使用. .net模式,在程序集中,指定使用哪个版本,在调用时,默认使用指定的版本,解决了dll地狱问题. 程序集信息 主版本,次版本.修订号.内部版