在.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,具体细节查书。关于程序集的部署配置有很多需要注意的地方。日后再说。

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

  1. C# 程序集Assembly

    原谅我到目前为止一直肤浅的认为程序集就是dll,这种想法是错误的. 今天就系统的学习记录一下“程序集”的概念.原文链接https://www.cnblogs.com/czx1/p/2014131370 ...

  2. CLR中的程序集加载

    CLR中的程序集加载 本次来讨论一下基于.net平台的CLR中的程序集加载的机制: [注:由于.net已经开源,可利用vs2015查看c#源码的具体实现] 在运行时,JIT编译器利用程序集的TypeR ...

  3. ASP.NET Web Froms开发模式中实现程序集的延迟加载

    延迟加载是一个很大的诱惑,可以达到一些比较好的效果,比如: 1.在实体框架中,由于关联数据的数量和使用时机是不确定的,通过延迟加载,仅在使用的时候去执行关联数据的查询操作,减少无谓的数据查询操作,可以 ...

  4. C#中的反射 Assembly.Load() Assembly.LoadFrom()

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

  5. 【笔试&面试】C#中的程序集

    1.      C#中的程序集(Assembly) 答:程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略 ...

  6. 在Win7中安装程序集到GAC

    原文:在Win7中安装程序集到GAC 微软为提高系统安全,自Vista推出后,在Windows系统中加入了一个新的东东——UAC(User Account Control),这样一个新的技术使得许多操 ...

  7. Net中获取程序集路径

      从内存中加载的程序集,无路径   IIS中路径 protected void Page_Load(object sender, EventArgs e) { Response.Write(&quo ...

  8. .NET中的程序集

    参考:http://blog.sina.com.cn/s/blog_7ade159d0102wmg9.html 程序集(Assembly,装配件,.NET程序集) 程序集是应用程序的部署单元,.NET ...

  9. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  10. C# 获取文件路径,读取项目中某程序集下文件

    获取文件路径 ------------------------------------------------------------------------- winform获取文件路径: stri ...

随机推荐

  1. 安卓开发service

    如果把Activity比喻为前台程序,那么service可以看做是一个后台程序.Service跟Activity一样也由Intent调用. 在工程里想要添加一个Service,先新建继承Service ...

  2. html 5的localstorag

    随着我们硬件技术的发展,浏览器本身的功能也愈发的完善,从之前的cookie到现在的本地缓存机制,再到web storage,在之前html4 的时候使用cookie具有一些明显的局限,如大小限制,co ...

  3. corejava_chap02

    //单行注释  --不能用在一行代码的中间/**/多行注释 --任何地方/** */文档注释  文档注释用在:package.class.member variables.member method. ...

  4. 【POJ2406】【KMP】Power Strings

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  5. mysql基础操作整理(一)

    显示当前数据库 mysql> select database(); +------------+ | database() | +------------+ | test | +-------- ...

  6. JQuery 实现鼠标经过图片高亮显示,其余图片变暗

    效果图: 当鼠标经过图片时,其余图片变暗,来高亮显示当前图片,主要用的是对比度.当然你也可以先把其他图片默认变暗,鼠标经过时高亮显示,不过,无鼠标经过时整体图片都会是偏暗色调. 效果可以通过 三步实现 ...

  7. php定时删除文件夹下文件(清理缓存文件)

    <?php ignore_user_abort(); //客户端断开时,可以让脚本继续在后台执行 set_time_limit(0); //忽略php.ini设置的脚本运行时间限制 $inter ...

  8. Ubuntu 字体安装

    命令安装:   以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放在自己的主目录下)(在widows目录的Fonts目录下找需要的字体)由于我是双系 ...

  9. IOS开发备忘

    1. ios 真机调试时出现CopyPngFile error解决方法 说是读取的时候没有找到这张图片,检查了一下图片路径,没有问题,于是google之,找到两种解决方法 : 方法一:在build s ...

  10. S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)

    一.介绍 九鼎的S5PV210开发板,在出厂前已经默认刷了Android4.0系统.如果需要刷其它的系统或者是由于系统问题无法启动时,就需要对板子刷机. 其实,刷机是对210开发板的一个基础学习,目的 ...