.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,具体细节查书。关于程序集的部署配置有很多需要注意的地方。日后再说。
转载于:https://www.cnblogs.com/zhangxl/p/4455637.html
.NET程序集(Assembly)相关推荐
- CLR: 那些你不知道你不知道的事情 程序集(Assembly)和模块(Managed Module)
CLR: 那些你不知道你不知道的事情 程序集(Assembly)和模块(Managed Module) 前言 一直都用集成开发坏境(IDE),一直对模块和程序集的概念理解的不是很直观,因为 ...
- C#-获取当前程序集Assembly的文件名
C#获取当前程序集Assembly的文件名 fly043488 展开 C# Code: string codeBase = Assembly.GetExecutingAssembly().GetNam ...
- C#程序集Assembly学习随笔(第一版)_AX
①什么是程序集? 可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件. 嗯,这个确实简单了些,但我是这么理解的.详细: http://blog.csdn.net/sws83 ...
- c#笔记--程序集(Assembly)、模块(Module)、类型(class)、命名空间、反射
Assembly =装配件.表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构建基块.(大概就是一组dll?) 命名空间:System.Reflection ...
- C#程序集Assembly学习随笔(增补版,附图)_AX
我一直以为我是个人才,今天才TMD知道,我是个天才! 下面的问题一下就弄出来了. 上篇我讲了下我对Assembly的初步认知. 现在来说说怎么使用已有的Assembly. 比如说我在做一个解决方案时 ...
- Unity关于程序集(Assembly )的那些事
学习大纲 一. 什么是程序集? 二. 为什么使用程序集? 三. 如何在Unity中使用程序集 1.基本常识 2.自定义程序集 3. 多层级的程序集 4. Assembly Definition Ref ...
- C# 程序集(Assembly)
程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件.程序集只是逻辑上的划分,一个程序集可以只由一个文件组成,也可由多个文件组成.不管是单文件程序集还是多文件程序集,它们 ...
- 为.Net程序集添加资源
作者:宋华 本文选自:赛迪网 2002年12月06日 在.Net结构中,程序集Assembly(也称着程序集或托管Dll)是自我描述的安装单元,它可以只包括一个PE(可移植可执行)格式的Dll ...
- c# 添加中文描述 给enum_理解C# 核心概念 – C# 程序集本地化
在之前几讲中,老白给大家介绍了C#中module和Assembly的生成和使用.在这一篇中,老白将更加深入的介绍下Assembly其中的一个知识点--本地化(Localization). 什么是本地化 ...
- 程序集强命名与GAC
1.新建项目Other,在其中创建如下类: using System; using System.Collections.Generic; using System.Text; namespace O ...
最新文章
- awstats linux日志分析,(总结)Linux下使用awstats分析Nginx的日志详情
- JUC多线程核心知识-思维导图
- React 之 高阶组件的理解
- 禅道 bug状态 open_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...
- C++多线程实例(_beginThreadex创建多线程)
- 搭建spring MVC项目
- 百度机器同传技术及应用小记
- Linux进阶之路————远程登录与vim编辑器
- 一款漂亮的赞助打赏单页界面美化版源码
- 微软服务器系统桌面无图标,开机桌面没有图标的几种解决方法
- SQL Server中事件探测器Profiler的使用
- input 单击 图标_input添加小图标
- 这款折纸机器人玩具,可以帮助孩子学习编程和Robot知识
- Nuget如何管理本地的包
- 什么是推荐系统?推荐系统类型、用例和应用
- Kibana警报之索引连接器
- mapbox创建空白底图
- 企业运维之服务管理 -- supervisord
- flask+python 实时视频流输出到前台
- canal同步mysql数据到rocketmq集群
热门文章
- IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)
- tolua#是Unity静态绑定lua的一个解决方案
- 域账户登录时提示“你的账户配置不允许使用这台电脑。请试一下其他电脑” 解决方案
- memtrack: Couldn‘t load memtrack module (No such file or directory) 的问题解决
- JAVA编程思想——读书笔记 多态
- win11退回win10一直黑屏转圈怎么办 win11退回win10黑屏转圈的解决方法
- Win11键盘在哪里设置?Win11键盘的设置方法
- AutopilotSim2驾驶模拟器使用
- SpringBoot配置RunDashboard
- json动态生成复杂表头excel_Excel办公用品管理系统,全函数统算,图表动态展示高效轻松...