.NET程序集1
谈谈.NET程序集(一)
谈谈.NET程序集(一)
The Assembly in .NET
by 唐小崇
http://www.cnblogs.com/tangchong
在.NET出现之前, Windows的程序有一些非常困扰人的问题:
1.当安装一个新的应用程序,有些时候会发现,它莫名其妙地损坏了已安装的应用程序(事实上是在系统的Win32文件夹内添加了与之前重名的dll文件,导致该dll被覆盖)。这种困境被称大家称为“DLL灾难”。
2.大部分的程序安装会影响到所有的系统部件。比如:要在不同的位置拷贝文件,要在注册表中添加信息。这个问题在于不能将应用程序作为一个单一的实体,这同时也导致了程序不便于拷贝/备份/部署。
3.安全问题。我们很难去保证程序的运行不会危害用户。
.NET程序 提出的程序集(Assembly)概念很好的解决了“DLL灾难”和部署难的问题,并且也提供一些安全保障。下面就让我们来谈谈程序集,程序集并不是一个单一的物理单位,它是由一个或者多个 包含元数据(Metadata)的托管模块(Managed Module)、一些资源文件 以及 清单 逻辑组成。
一、托管模块(exe/dll)的相关概念
托管模块一般以.exe/.dll的形式出现,它们由面向CLR的编译器生成。它主要包含以下四个部分:
1、PE32/PE32+ header 。标准windows PE 头文件,主要指定了 该模块是32还是64位文件。还指定了给模块是GUI(exe),CUI(exe)或者DLL 其中的一种。
2、CLR header。CLR header 的定义在CorHdr.h文件中。它主要包含CLR版本、模块入口函数(Main函数)的 MethodDef 元数据、元数据的大小及偏移量、可选的强签名。
3、Metadata。元数据是以二进制数据组成的块(a block of binary data)。它中包含3类表,分别是:定义表(definition tables)、引用表(reference tables)、清单表(manifest tables)。由于元数据提供如此完备的信息,使得程序集具有自描述的功能,从而解决了博客开头的前两个问题。
·定义表(definition tables) 包含本模块内定义的 类型,方法,字段,参数,属性,事件。
·引用表(reference tables) 包含了本模块所引用的 数据集,模块,类型,方法,字段,属性,事件。
·清单表(manifest tables) 是描述整个程序集的表。它包含了程序集中所有文件的名称以及程序集的版本、文化、出版者、公开导出的类型。
托管模块通常包含定义表和引用表,而清单表一般给程序集使用的(下文会说到)。
我们可以用 ILDasm.exe来查看这些元数据。
4、IL code。中间代码,编译器产生的面向CLR的代码。在运行时,CLR将其转换为本地CPU指令。
二、程序集
我们把一个或者多个托管模块,资源文件 组成一个程序集,同时,它有个专门的文件来保存 清单表元数据,这个清单包含了程序集中所有文件的名称以及程序集的版本、文化、出版者、公开导出的类型。
一定得注意的是:虽然托管模块具有我们常见的exe文件形式,但CLR操作的对象是程序集,而不是托管模块。CLR总是先加载清单文件,然后通过清单文件来获得其他文件的名称。虽然程序集可以只包含一个托管模块文件(exe)但是我们要以程序集为单位来进行操作,而不是一单个托管模块(exe)作为单位。
·程序集定义了可复用的类型(供其它程序集/模块 使用)
·程序集以版本号来标识
·程序集里包含安全相关的策略信息。
CLR区分单个托管模块是否是程序集的方法是:查看它是否包含清单元数据表。
不用单个托管模块而用程序集做个一个执行单位 的好处是:
1、我们可以把不同作用的类型放在不同的文件(托管模块)中,在互联网中,可以以增量的形式下载文件。即需要用的时候再下载该部分文件。
2、我们可以添加各种的资源、数据文件通过连接器链接到程序集中,比如Excel表,然后再程序里做好读取即可。
3、我们可以用不同的语言来生成不同功能的托管模块,这样每个语言的优势就体现出来了。
由于程序集有良好的自描述性,我们在部署(或者用户拷贝)程序集时,都非常方便。只要直接将程序集的文件拷贝到用户的磁盘中就好了,CLR会通过清单文件来找到各个所需文件。这样就避免在win32,注册表中放置文件,照成风险了。下图为一个程序集的示例:
.NET程序集1的更多相关文章
- 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程
读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...
- 【.net 深呼吸】程序集的热更新
当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...
- 【.net 深呼吸】跨应用程序域执行程序集
应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...
- 运用Mono.Cecil 反射读取.NET程序集元数据
CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...
- .NET 程序集单元测试工具 SmokeTest 应用指南
Smoke Test(冒烟测试),也称Regression Test(回归测试),是对软件的安装和基本功能的测试.一般地我们使用脚本来实现Smoke Test的自动化,可借用虚拟机的snapshot机 ...
- MSSQLSERVER添加c# clr程序集的使用方法
前言 MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨.这么好的机制,大 ...
- “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用
除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性" ...
- 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。
在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...
- 未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件
ASP.NET 运行时错误:针对类型System.Web.Mvc.PreApplicationStartCode的应用程序邓启动初始化方法Start 引发了异常,显示下列错误消息: 未能加载文件或程序 ...
- 比较.NET程序集(DLL或EXE)是否相同
如何比较两个.NET程序集(DLL或EXE)是否相同呢? 直接比较文件内容?当然没那么简单了,这个你可以去试试,去比较一下两次Build产生的程序集, 就算内容没有改变,产生的程序集的二进制文件也是不 ...
随机推荐
- 【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈
原文:[百度地图API]如何制作一张魔兽地图!!--CS地图也可以,哈哈哈 摘要: 你玩魔兽不?你知道如何做一张魔兽地图不?! 快来看此文吧! ---------------------------- ...
- Github Pages 静态网页建站
创建仓库 略.详见GitHub使用教程. 仓库属性设置 找Github Pages项.点击自己主动生成,依照提示操作,就会得到该项目的gh-pages 分支. 公布站点成功,地址为 http://ch ...
- 新版live555代理server
好久没搞流媒体了,近期又回归了,已经把live555代理服务器更新到最新的live555代码(V0.82). 改进了一大坨问题,还去掉了一个类,代码更精简了. 改进了命令行參数格式,仅仅要这样:rts ...
- sqlite学习笔记5:插入数据,查询数据和删除数据
曾闻:全部的编程都是已数据为中心,觉得很有道理. 所谓数据库数据库,没有数据叫什么数据库,接下来就看看怎样在表中插入数据. 一 插入数据 1 创建一张表 首先为了插入数据,须要先创建一张表: CREA ...
- java中HashSet详解
HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...
- 尚学堂Java面试题整理
博客分类: 经典分享 1. super()与this()的差别? - 6 - 2. 作用域public,protected,private,以及不写时的差别? - 6 - 3. 编程输出例如以 ...
- 最新发布树莓派2代Wi-Fi自动连接实战(适合初学者)
话说天地会珠海分舵在上几天才刚给大家分享了个海外资讯说树莓派2已经发布且Windows10加盟之类的资讯,具体请查看<海外优秀资讯抢先看8 - Windows 10 for Raspberry ...
- c#万能视频播放器(附代码)
原文:c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的 ...
- Java 异常归纳总结
1.异常的分类 1) Checked exception: 这类异常都是Exception的子类 .异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常.可能导致 ...
- Sql Server 自定义数据类型
SQLServer 提供了 25 种基本数据类型: ·Binary [(n)] 二进制数据 既可以是固定长度的(Binary),也可以是变长度的.其中,n 的取值范围是从 1 到 8000.其存储窨 ...