.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,具体细节查书。关于程序集的部署配置有很多需要注意的地方。日后再说。
.NET中的程序集(Assembly)的更多相关文章
- C# 程序集Assembly
原谅我到目前为止一直肤浅的认为程序集就是dll,这种想法是错误的. 今天就系统的学习记录一下“程序集”的概念.原文链接https://www.cnblogs.com/czx1/p/2014131370 ...
- CLR中的程序集加载
CLR中的程序集加载 本次来讨论一下基于.net平台的CLR中的程序集加载的机制: [注:由于.net已经开源,可利用vs2015查看c#源码的具体实现] 在运行时,JIT编译器利用程序集的TypeR ...
- ASP.NET Web Froms开发模式中实现程序集的延迟加载
延迟加载是一个很大的诱惑,可以达到一些比较好的效果,比如: 1.在实体框架中,由于关联数据的数量和使用时机是不确定的,通过延迟加载,仅在使用的时候去执行关联数据的查询操作,减少无谓的数据查询操作,可以 ...
- C#中的反射 Assembly.Load() Assembly.LoadFrom()
一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...
- 【笔试&面试】C#中的程序集
1. C#中的程序集(Assembly) 答:程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略 ...
- 在Win7中安装程序集到GAC
原文:在Win7中安装程序集到GAC 微软为提高系统安全,自Vista推出后,在Windows系统中加入了一个新的东东——UAC(User Account Control),这样一个新的技术使得许多操 ...
- Net中获取程序集路径
从内存中加载的程序集,无路径 IIS中路径 protected void Page_Load(object sender, EventArgs e) { Response.Write(&quo ...
- .NET中的程序集
参考:http://blog.sina.com.cn/s/blog_7ade159d0102wmg9.html 程序集(Assembly,装配件,.NET程序集) 程序集是应用程序的部署单元,.NET ...
- 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,这种形 ...
- C# 获取文件路径,读取项目中某程序集下文件
获取文件路径 ------------------------------------------------------------------------- winform获取文件路径: stri ...
随机推荐
- [FindBugs分析记录]Redundant nullcheck of o,which is known to be non-null
官网解释: This method contains a redundant check of a known non-null value against the constant null. 这种 ...
- C宏系统缺陷
这两天稍稍看了一下boost的preprocessor库,发觉boost那帮疯子竟然利用各种奇技淫巧定义出各种数据类型和结构,还在上面定义出加减乘除等等各种运算,在快速浏览的过程中,还瞄到了很眼熟的各 ...
- Java使用百度云存储BCS-让你的数据下载飞起来
作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云.国内的云服 ...
- 原生javascript写的侧栏跟随效果
浏览网站时经常看到有的网站上,当一个页面很长的时候,设定侧栏内容会跟随滚动条滚动,我们把这种效果叫做“侧栏跟随滚动”.这种特效对提高网站浏览量.文章点击率.广告点击量都有一定效果. 侧栏跟随滚动的实现 ...
- Dedecms自定义sql 出现错误Safe Alert: Request Error step 2!
Dedecms自定义执行sql: SELECT body FROM dede_addonarticle WHERE aid = (select max(aid) fromdede_addonartic ...
- PhotoSwipe.js 相册展示插件学习
PhotoSwipe.js官网:http://photoswipe.com/,在这个网站上可以下载到PhotoSwipe的文件以及相关的例子. 这个组件主要是用来展示图片.相册用的,还是很实用的. 一 ...
- apt-cache madison package-name
apt-cache madison package-name 搜索软件有那些可用版本,
- BAE 环境下配置 struts2 + spring + hibernate(SSH)(三)spring&hibernate
1.在lib中加入必要的包,导入后结果如下: lib打包下载:SSH-lib.jar (struts2.3.1.2 spring3.0.5 hibernate3.6.10.Final) 只包含必要 ...
- How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code = 0) ?
How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code ...
- 【Linux】基础配置-修改命令提示符的风格
1,效果图: [groot]$ 2,设置步骤: 编辑~/.bashrc文件,在最后增加设置行: #显示当面目录的最后一层目录#PS1='\[\e[32m\][\u@\h \W]$\[\e[m\]'#只 ...