.NET程序集(Assembly)

在.NET 中,新引入了一个程序集的概念,就是指经由编译器编译得到的,供CLR进一步编译执行的那个中间产物,在WINDOWS系统中,它一般表现为.dll,或者是.exe的格式,但是要注意,它们跟普通意义上的WIN32可执行程序是完全不同的东西,程序集必须依靠CLR才能顺利执行。

之所以要编译为程序集然后由.NET FRAMEWORK解析执行,就是为了实现跨平台的功能。并且由CLR解析执行可以针对不同的具体平台生成具体针对性的优化代码,对执行效率也有好处。

程序集的格式如下:

WIN32文件头

CLR文件头

CIL代码

类型无数据(metadata)

程序集清单(manifest)

可选的嵌入资源

既然这儿都包含WIN32文件头了,跨平台又从何跨起呢?肯定不是这么简单,要是想在别的平台上,应该还是需要重新编译。

因为任何一个模块,要想让WINDOWS执行,必须先跟WINDOWS打招呼,然后由WINDOWS再调用CLR来解析执行你的模块,而不会由CLR直接监听到你的双击事件而启动解析。关于WIN32文件头,在VISUAL STUDIO 2008中,打开 Command Prompt 工具,然后在其中调用这个程序 : dumpbin 然后给其参数:

dumpbin  test1.exe  /headers                                  (这个工具也可以使用在普通WIN32可执行程序上。)

这样子就可以看到某一程序集的WIN32文件头信息。看一下头三行是这样子的:

Dump of file test1.exe

PE signature found

File Type: EXECUTABLE IMAGE  (刚看到时我发现这个 EXECUTABLE IMAGE,是不是普通的可执行程序不是IMAGE呢?打开一个普通的看了一下,发现也是。。)

dumpbin 工具还可以用 /clrheader 参数查看一个.NET程序集的 CLR 头信息。

接下来是CIL代码部分,这就是一个程序集的最核心部分了。CIL的细节日后再具体学习吧。

元数据部分完整地描述了程序集内含类型和引用外部类型的格式。.NET CLR利用元数据在内存的二进制布局类型中类型(以及类型成员)的位置,使远程方法调用更便利。元数据是反射得以实现的重要条件。

MANIFEST里面详细记录了程序集中的每一个模块,其版本,以及引用的外部程序集。

查看CIL , METADATA, MANIFEST 需要借助于 ildasm.exe 或者 reflector.exe 工具。

在大多数情况下,一个程序集由一个独立的模块组成。但是,有时候程序集大了后,为了降低耦合度,可以把它分解为多文件程序集。由多个 .dll 文件来组成它。其中会有一个 .dll 做为主模块。然后主模块的清单记录了它依赖的每一个 .dll 文件。并且,这些不同模块可以由不同的语言写成。

在VS2008中,选择新建项目中的 Class Library 就可以自动生成 .dll 类库文件。这时候,程序中没有Main()方法,你只能BUILD它,但不能运行它。

如果你要在某个项目中使用它,那么你需要添加到该二进制文件的reference 引用,然后using 它的命名空间,这样子。。。

私有程序集 与 共享程序集

私有程序集就是不同项目中生成的程序集,仅供本项目使用,或者可以经过配置被某一个其它项目的程序集引用。

共享程序集是机器级别的共享程序集,它放置一个叫GAC (Global Assembly Cache)的地方,可以被其它所有的私有程序集所引用。注意,GAC中只能放置.dll文件,而不能有.exe 文件。关于如何部署到GAC,具体细节查书。关于程序集的部署配置有很多需要注意的地方。日后再说。

时间: 2024-10-05 23:46:09

.NET程序集(Assembly)的相关文章

.NET 程序集Assembly使用

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

反射 学习笔记(一) 基本概念(元数据 程序集 Assembly Type)

一.元数据 可以理解为描述信息(类.类中的成员.成员的参数及返回值). 二.程序集 我们所写的所有代码都会通过编译器编译到程序集(.exe或.dll)文件中 ,并在运行时以[Assembly对象]方式加载到内存中运行 运行时 程序集(.exe或.dll)加载到内存中就是Assembly对象 类(class.Interface)加载到内存中就是Type对象 类的成员(方法.字段.属性.事件)加载到内存中分别是 MethodInfo.PropertyInfo.FieldInfo.EventInfo对

.net 程序集的加载与反射

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

反射+type类+Assembly+特性

什么是元数据,什么是反射: 程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据. 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中. 程序在运行时,可以查看其它程序集或其本身的元数据.一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射. 下面我们我们来学习如何使用Type类来反射数据,以及如何使用特性来给类型添加元数据. Type位于System.Reflection命名空间下 Type类 预定义类型(i

《精通C#》第18章-CIL和动态程序集的作用

CIL是一种底层语言,CIL语言仅仅定义了一组通用的关键字,由CIL编译器进一步将这些关键字分为指令,特性以及操作码.指令是指用来描述程序集总体结构的CIL关键字,指令在语法上使用一个"."做前缀来表示,特性是指定以何种方式执行指令的CIL关键字,比如.public,操作码就是实现程序集实现逻辑.CIL是一个以栈为基础的开发语言,在CIL中实现栈的是虚拟执行栈,因为这种的数据访问方式,导致CIL不能直接访问一个数据,必须先显示加载入栈中,在需要使用该值的时候,再使用一系列的操作码,将数

Clr Via C#读书笔记---程序集的加载和反射

#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef); public static Assembly Load(String assemblyString); } 在内部,Load导致CLR向应用程序集应用一个版本绑定重定向策略,并在GAC中查找程序集.如果传递的是一个弱命名程序集,不会应用版本绑定重定向策略,也不会去GAC中查找程序集. AppD

30天C#基础巩固----程序集,反射

一:认识程序集       只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集.那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly).       可以看做是一堆相关类打包的包,相当于java中的jar包(*);       程序集包含:类型元数据,程序集元数据,IL代码,资源文件       类型元数据:描述在代码中定义的每一类型和成员的二进制形式.       程序集元数据:程序集清单,版本号,名称等:       IL代码:被微软

反射 | 程序集

什么是程序集: 程序集是.net中的概念,net中dll和exe都是程序集,他们的区别就是exe可以直接执行(因为它有入口main函数,而dll没有,)而dll 不可以直接执行,它没有入口main函数,它是供其他程序来调用的 控制台应用程序最后编译成了exe文件,而类库编译生成了dll文件 什么是放射: 放射就是通过编程的方式,动态加载程序集,并获取里面类型,并创建对象,调用其成员的过程,这就是反射 <1> 我们来首先在解决方案下创建一个类库,命名为"TestDll"  代

C#程序集系列06,程序集清单,EXE和DLL的区别

CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→把MainClass.cs编译成程序集→反编译MyDll.dll,在1.txt文件中呈现 ildasm /out:1.txt MyDll.dll →打开1.txt文件 1.txt // Metadata version: v4.0.30319 .assembly extern mscorlib {

C#程序集系列02,使用记事本查看可执行程序集的IL代码

继续上一篇"C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序",在F盘的as文件夹中已经有了若干程序集.本篇体验使用记事本查看可执行程序集的IL代码. →打开"VS2012开发人员命令提示",输入如下命令,并按回车在as文件夹中多了1.txt和1.res这2个文件→输入如下命令打开1.txt // Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.18020