如果你正在开发面向DotNet平台的应用程序,那么你肯定对“程序集”和“托管模块”这两个概念不陌生,这是DotNet带来的术语。这两个概念很容易混淆,有人认为它们指的是同一样事物,其实不然。这里,我写下自己的一些理解。

为了便于说明问题,我们先看看一个公司的某项目开发团队,这个“团队”由团队“成员”组成(可能还有一些资源),而在这些团队成员中,必然有一个成员是这个团队的头头,为了表示不是普通的成员,头头都有一个称号,比如说“经理”或者“负责人”。经常的,说到某个团队,我们只要知道它的头头就可以了。也就是说,头头代表了这个团队(注意,这里是"代表")。如果其他人有什么事情要与这个团队交流(比如团队向外说明本团队完成了什么任务等),没有必要将每个成员找来交流,我们只要找到头头就可以了。 因为头头知道本团队的一切,他掌握了关于团队的所有信息:本团队有哪些成员,而且有些什么资源可以利用,与其他哪些团队有交流等等。常见的团队有多个成员,一个成员的团队很少见(头头也是他),但为了说明问题,我们假定一个成员的团队和多个成员的团队都存在。
从上面的讨论中我们可以这样总结:团队是个逻辑概念,并不是指某个人或资源,它是一个集合,而且这个集合不为空,只有当拥有大于或者等于多个成员的时候它才称之为团队。
嘿,大家看出来了,我之所以要说项目开发团队和成员,是因为在DotNet中的程序集和托管模块的概念与此类似。程序集其实并不是说某个文件,它是一个逻辑概念,就像一个团队。当然,我们习惯说a.exe 或者b.dll是个程序集,其实这样说多少会让人混淆,请看下面的说明。而托管模块就像是团队中的团队成员。哈,你肯定想到了,其中必然有一个托管模块是整个“团队”的“头头”,它负责管理所有的托管模块,关于这个程序集的一些信息也保存在这个托管模块中。我们把这样的模块叫做“主托管模块”(我记得某本书上是这样叫的)。为了区分主托管模块和普通托管模块,怎么办呢?这个好说,人最擅长给自己挂头衔了,借鉴一下。我们给普通托管模块和主托管模块不同的后缀名,普通托管模块的后缀名是.netmodule,而主托管模块的后缀名是.exe 或者.dll。和开发团队中头头代表整个团队一样,主托管模块代表着整个程序集。既然是主托管模块,那么它肯定与其他托管模块不一样。一般的托管模块包含有IL代码和元数据,而这个主托管模块有没有IL代码和元数据并不重要,但它一定要有“清单”,也就是关于整个程序集的数据。
为什么主托管模块会有两种后缀名呢?这是因为分工的原因,有的程序集是为其他程序集提供便利的,它实现了一些数据类型(类库)或者拥有某些资源――这就是后缀名为.dll的程序集。这样的程序集不喜欢抛头露面,它们是“幕后程序集”。另一种程序集,后缀名为.exe,用户直接和它们打交道。有的功能它自己实现,但有些呢就交给幕后程序集去实现。为了区别,我们就把这样的程序集叫做“前台程序集”吧。DotNet规范中没有这两个概念,这里是为了理解才造的词。当然,读者朋友都会有自己比较习惯的理解名字。一个可执行应用程序中,只有一个前台程序集的概念,但是可以有零个或一个或多个幕后程序集。
我们又回到实际生活中的开发团队概念上来。团队的组成有这样几种情况:
a.一个成员,这样的成员是比较厉害的那种,比如个人软件开发者,自己对自己负责,自己是自己的头头;
b.多个成员,其中某个成员是头头;
程序集与此类似,所以就有了单模块和多模块程序集(有时也称单文件程序集和多文件
程序集)。如果要实现的功能不是很烦杂,那么就用单模块程序集吧;但是,如果要实现的功能比较多,而且也好分开,那么建议你用多模块程序集吧,如果以后某个功能的实现方案改变的话,只要修改这个模块就行了,这样一来,极大的降低了开发的烦杂度。还有几点要注意,有的托管模块并不实现某种计算功能,它们仅仅是提供一些资源,比如说字符串;有时程序集除了包含托管模块外,还包含一些另外的资源文件。上面说的好像不是很直观,我们再结合下面的几幅图来理解。
    我相信现在大家对程序集和托管模块分别是什么以及两者间的关系有了较好的理解。但是如果有源代码辅助一下那就更好了。是的。对程序员来说,源代码比什么都亲切。好的,下面就举两个简单的例子(用C#语言表述)。一个是单模块程序集,一个是多模块程序集。两者都是前台程序集(后缀名是exe)。我用Visual C# 2003 集成开发环境试了一下,竟然发现它不支持多程序集的开发(希望是我没有找到)。没关系,我们还有DotNet FrameWork SDK呢,不用怕。它自带的C#编译器csc.exe很好用。至于csc的用法我就不多说了。
     例子1。单模块程序集:
     首先找个文本编辑器,将下面的代码敲进去,然后将它保存起来,取名为Hello.cs。 例如我把它存为e:\test\Hello.cs。
Hello 的代码
using System;

namespace 程序集测试
{
    public class Hello
    {
        static void Main()
        {
            Console.WriteLine("Hello World");
        }
    }
}

然后,打开SDK命令行提示,定位在Hello.cs所在的文件夹,比如我的是e:\test。在命令行提示中输入命令 csc Hello.cs,这个命令默认的是生成 .exe文件,也就是一个主托管模块。 现在到Hello.cs所在的文件夹中看看,你会发现一个新文件Hello.exe。好,一个主托管模块诞生了。既然有主托管模块,那么就标志着一个程序集的诞生。再看看,没有其他的托管模块,那么这个程序集就是一个单模块程序集。
例子2。多模块程序集:
假设我们要编一个程序来管理动物园。这里为了简单,不考虑继承等问题,每个动物用一个类来表示,并且用一个托管模块来实现。将所有的动物都放在命名空间"程序集测试"中。现在动物园有两种动物:Dog和Cat。看下面的代码:
Dog 的代码
using System;

namespace 程序集测试
{
    public class Dog
    {
        public void SayHello()
        {
            Console.WriteLine("I am a dog, wang wang wang");
        } 
    }
}

Cat 的代码
using System;

namespace 程序集测试
{
    public class Cat
    {
        public void SayHello()
        {
            Console.WriteLine("I am a cat, miao miao miao");
        }
    }
}

Zoo 的代码
using System;

namespace 程序集测试
{
    public class Zoo
    {
        static void Main(string[] args)
        {
            Dog aDog = new Dog();
            Cat aCat = new Cat();

aDog.SayHello();
            aCat.SayHello();

Console.ReadLine();
        }
    }
}

将上面的三个文件保存好,比如放在文件夹e:\zoo 中。再一次打开SDK命令行提示,定位到e:\zoo  
输入命令 csc /t:module Dog.cs 看看文件夹,你会发现一个新文件 Dog.netmodule
哈,这是一个托管模块,普通的托管模块。
接着输入命令 csc /t:module Cat.cs 同样得到一个普通托管模块 Cat.netmodule 。好现在有了两个普通托管模块。
为了实现一个程序集的梦想,必须还要有一个主托管模块。好,接着输入
csc /addmodule:Dog.netmodule;Cat.netmodule Zoo.cs  你会在文件夹中发现一个名为Zoo.exe的文件,这就是你想要的主托管模块。
好了。现在你有三个托管模块,并且任命其中一个为主托管模块,这样你就拥有了一个程序集了。这个程序集的组成是:Dog.netmodule, Cat.netmodule, Zoo.exe 。我们习惯说这个程序集是Zoo.exe 。但是一定要知道,Zoo.exe 其实是一个程序集的“头头”,由它代表着整个程序集。
使用 Visual Studio 只能生成单文件程序集。

转载于:https://www.cnblogs.com/kimma/archive/2008/09/01/1281260.html

程序集与托管模块的概念相关推荐

  1. CLR via C# 3 读书笔记(2):第1章 CLR执行模型 — 1.2 将托管模块组合为程序集

    实际上,CLR直接打交道的是程序集,而不是模块.程序集是一个抽象的概念,首先,它是一个或多个模块或资源文件的逻辑组合(即程序集由多个模块和资源文件组成).其次,它是复用.安全.版本的最小单元.根据所选 ...

  2. CLR基础全面版-概念、执行模型、托管模块、程序集、FCL

    文章目录 CLR介绍 概念:CLR Common Language Runtime 公共语言运行时 执行模型 .NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境 托管模块 程序集 F ...

  3. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  4. CLR: 那些你不知道你不知道的事情 程序集(Assembly)和模块(Managed Module)

    CLR: 那些你不知道你不知道的事情   程序集(Assembly)和模块(Managed Module)     前言 一直都用集成开发坏境(IDE),一直对模块和程序集的概念理解的不是很直观,因为 ...

  5. 【CLR的执行模型:将源代码编译成托管模块】

    CLR:由多种不同编程语言使用的运行库 托管模块:中间语言和元数据 非托管语言:C/C++,不过此为特殊,可以写成托管代码 托管语言:C# 托管模块 1,PE32/PE32+头:PE32运行在win3 ...

  6. SAP MM模块常用概念--供应商评价

    SAP MM模块常用概念--供应商评价 供应商评估功能能尽量优化采购操作,能简化选择货源过程.不断跟踪和考察现有的供应关系. 使用R/3供应商评估系统能保证更大的客观性,因为所有供货商以同一标准评估并 ...

  7. python modbus类封装_Python 中引入一个文件,模块的概念

    Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块. 通过这些强大的模块可以极大地提高开 ...

  8. 模块的概念,组建地概念?

    1.模块(Model) 通常所指"模块"是指编程语言所提供的代码组织机制,利用此机制可将程序拆解为独立且通用的代码单元. 根据不同的关注点,将一个项目的可以共享的部分抽取出来,形成 ...

  9. SAP UI5 初学者教程之六 - 了解 SAP UI5 的模块(Module)概念试读版

    Jerry 从 2014 年加入 SAP成都研究院 CRM Fiori 开发团队之后开始接触 SAP UI5,曾经在 SAP 社区和"汪子熙"微信公众号上发表过多篇关于 SAP U ...

  10. C 设计语言编译生成的是中间语言IL,一、源代码-面向CLR的编译器-托管模块-(元数据IL代码)...

    本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...

最新文章

  1. MS SQL Server存储过程
  2. Map集合的遍历(java)
  3. HyperLPR Python3车牌识别系统的入门使用
  4. Spring Cloud Alibaba到底坑不坑?反正是解放了部分使用的繁琐!
  5. 批处理查找html,批处理(bat)实现全盘搜索指定文件获取其完整路径方法大全,bat大全分享...
  6. 多线程解决同步问题浅析
  7. word目录怎么跳转到相应页码_Word目录不会做?请看完整操作步骤
  8. 二叉搜索树bst_二进制搜索树(BST)–搜索插入和删除
  9. 米家的扫地机器人是灰色_重新定义扫地机器人概念——米家扫地机器人 - IT168试客...
  10. 李嘉诚:没有人愿意贫穷,但出路在哪(转自意林)
  11. ftp客户端工具,几款优秀的ftp客户端工具
  12. C语言随机函数的使用
  13. 微信小程序播放背景音乐,关闭背景音乐的操作
  14. android 静态工厂方法,Android 源码中的静态工厂方法
  15. Vitis 加速环境简介
  16. python条件语句多条件_Python简介,第3章-条件语句
  17. [电路]12-回路电流法
  18. 琐记之生活感悟(关于日常生活的东西都丢这里)
  19. 子墨庖丁Android的ActionBar源代码分析 (一)实例化
  20. 复化梯形公式、复化Simpon公式、Romberg算法(python)

热门文章

  1. JAVA对象属性方法的使用
  2. delphi中webbrowse控件中模拟点击文本超链接_游戏中lt;控件gt;的思考
  3. 使用poi生成word文档(最全例子)
  4. [渝粤教育] 广东-国家-开放大学 21秋期末考试财务会计(二)10165k2
  5. 21秋期末考试电子商务概论10250k2
  6. [渝粤教育] 西南科技大学 工程测量 在线考试复习资料(1)
  7. 【sklearn第二十一讲】矩阵分解问题
  8. 计算机网络基础系列(一)概述、计算机网络性能
  9. python练习题4
  10. linux命令行删除N天前的数据的命令