认识程序集:1. 程序集的生成
源文来看:http://www.cnblogs.com/netatomy/archive/2008/06/10/1216872.html
程序集(Assembly)是.NET程序的最小组成单位。每个程序集都有自己的名称、版本等信息。程序集通常
表现为一个文件(.exe或.dll文件),这样的程序集被称为单文件程序集,这种程序集是最常见的。程序
集也可以由多个文件组成,每个文件都是一个模块文件或者是一个资源文件,这样的程序集被称为多文件
程序集。下面来了解一下如何生成单文件程序集和多文件程序集。
1. 单文件程序集的生成
这是最常见的程序集,使用 Visual Studio 只能生成单文件程序集。使用 csc.exe 能够很轻松地生成
单文件程序集:
csc.exe /target:library /resource:Hello.jpg Hello.cs
上述命令执行后,会生成一个名为 Hello.dll 的文件,该文件组成了单文件程序集。这个文件是一个托
管模块,存储了类型元数据和中间语言,还嵌入了资源文件 Hello.jpg 的内容(通过使用 /resource
选项)。类型元数据描述了模块中定义的类型及其成员,中间语言是编译后的托管代码。
程序集本身其实是一个逻辑概念,对于自身的描述是通过程序集清单来实现的。程序集清单是一种元数据
,描述了程序集的名称、版本、区域性和强名称信息,还包括组成程序集的文件的列表和资源信息,以及
其他信息。在单文件程序集中,程序集清单的元数据直接保存在主模块文件中。
在本例中,程序集中的名称是Hello,版本没有提供,默认为0.0.0.0,区域性为语言中立,强名称信息为
空,文件列表只有Hello.exe,托管资源为Hello.jpg。
2. 多文件程序集的生成
多文件程序集比较少见,而且除了使用 csc.exe 之外,有时还需要使用 AL.exe。假设有两个源代码文件
A.cs 和 B.cs,我们有两种生成多文件程序集的方法,这两种方法的主要区别在于程序集清单是存储在某
个模块中还是单独存储于主模块中。
先看第一种方法,只使用csc.exe就可以了:
csc.exe /target:module A.cs
csc.exe /target:library /addmodule.A.netmodule /out:Hello.dll B.cs
第一个命令将 A.cs 编译为一个模块文件,A.netmodule,该文件仅包含类型元数据和中间语言,不包含
程序集清单,是一种“原始”的模块文件,不能独立存在,必须从属于程序集。第二个命令将 B.cs 编译
成模块文件,Hello.dll。这个文件除了包含类型元数据和中间语言之外,还存储了程序集清单,因为成
为主模块文件。此时,程序集的名称仍然为 Hello,但文件列表的内容变成了两个:A.netmodule 和
Hello.dll。
再来看第二种方法,需要使用 csc.exe 和 al.exe 两个命令:
csc /target:module A.cs
csc /target:module B.cs
al.exe /target:library /out:Hello.dll A.netmodule B.netmodule
前两个命令将 A.cs 和 B.cs 编译为两个“原始”的模块文件,A.netmodule 和 B.netmodule。第三个
命令使用了AL.exe(Assembly Linker,程序集链接器),该命令能够将 A.netmodule 和 B.netmodule
组合到程序集中。这样,最终会生成 Hello.dll 这个主模块文件,该文件将仅包含程序集清单。在这个
程序集清单中,文件列表的内容变成了三个:A.netmodule,B.netmodule 和 Hello.dll。
多文件程序集不仅生成麻烦,而且应用似乎也不是很广泛,因为对于CLR来说,它只认识程序集,所以部
署的时候,都是以程序集作为最小单位。一旦某个“原始”模块发生了改变,整个程序集都必须重新生成
。另外,只有程序集有版本,模块作为程序集的组成部分,不能被版本化。
认识程序集:1. 程序集的生成相关推荐
- 二、源代码=程序集及程序集概念介绍
文本脉络图如下: 一.源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了编译器将源文件编译成托管模块(中间语言和元数据),本文主要介绍如何将托管模块合并成程序集. 1.程序集的 ...
- 使用sn.exe为程序集签名
前言 在写上一篇随笔时,为理解EF事务底层的原理,我去Github上把EF的源码下载放到自己项目调试,不过在编译时遇到了下面这个报错信息.经过一番查阅,了解到了程序集签名(也称强名称签名)的概念.报错 ...
- .Net高级技术——程序集
程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包(*).打包的目的:程序中只引用必须的程序集,减小程序的尺寸:一些程序集内部的类不想让其他程序集调用. 我们调用的类 ...
- 友元程序集(C# 和 Visual Basic)
友元程序集(C# 和 Visual Basic) Visual Studio 2013 "友元程序集"是一种能够访问其他程序集的 Friend (Visual Basic) 或 i ...
- 使用 NuGet 管理我们的程序集 - 预发行版
1.缘起 在我们的项目中.须要引用的组件统一放在一个 Libs 文件夹下.不管对于平台上的公共组件.还是应用模块,都是如此. 假设一个应用模块,比如能源管理(EM).要引用平台提供的公共组件,比如数据 ...
- .NET 之路 | 007 详解 .NET 程序集
上一篇我们介绍了 Roslyn 编译器,我们知道,我们编写的 C#/VB 代码经过 Roslyn 编译器编译后会生成程序集文件.按照之前讲的 .NET 执行模型的顺序,这一篇我具体讲讲程序集. 什么是 ...
- C#图解教程 第二十一章 命名空间和程序集
命名空间和程序集 引用其他程序集 在第1章中,我们在高层次上观察了编译过程.编译器接受源代码文件并生称名称为程序集的输出文件.这一章中,我们将详细阐述程序集以及它们是如何生成和部署的.你还会看到命名空 ...
- [007] 详解 .NET 程序集
上一篇我们介绍了 Roslyn 编译器,我们知道,我们编写的 C#/VB 代码经过 Roslyn 编译器编译后会生成程序集文件.按照之前讲的 .NET 执行模型的顺序,这一篇我具体讲讲程序集. 1什么 ...
- 【笔试面试】C#中的程序集
1. C#中的程序集(Assembly) 答:程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略 ...
最新文章
- visual studio code(vs code)如何更换颜色背景
- 关于series的统计
- 图解:人性的7种兵器(互联网商业逻辑)
- 4)公有成员\私有成员和静态成员
- Docker: Jenkins里的pipeline编写基本技巧
- 百度初级认证有用吗_知乎“打败”了百度知道吗?
- 面向对象(基础oop)之继承总结
- 知道央视大楼为什么又叫“痔疮”么,看看你就明白了
- freeradius 测试mysql_在linux下安装配置mysql+freeradius
- .NET应用程序调试—原理、工具、方法
- 硬件开发笔记(七): 硬件开发基本流程,制作一个USB转RS232的模块(六):创建0603封装并关联原理图元器件
- 2010年8月刊:精选热门微博
- android 计步器acc,利用腾讯云云函数执行部署修改小米运动步数代码_每天自动修改步数...
- your cuda software stack is old.we fall back to the NIVIDIA driver for some compilation. Update your
- lambda中FirstOrDefault和First
- 内存规格的解释(Unbuffered DIMM,Registered DIMM和SODIMM)
- 查看计算机的硬盘的命令,电脑怎么看配置,查看电脑配置命令
- 驼峰,下划线(蛇形)和帕斯卡型一些转换
- 山西工程技术学院计算机专业在哪个校区,山西工程技术学院有几个校区及校区地址...
- Google Play的QUERY_ALL_PACKAGES或REQUEST_INSTALL_PACKAGES权限问题