[.NET] CLR

公共语言运行时(CLR),是一个可由多种编程语言使用的“运行时”。包括,内存管理,程序集加载,安全性,异常处理和线程同步,它们可以由面向CLR的所有语言使用。在运行时,CLR根本不关心开发人员用哪一种语言来写源代码。

微软已经创建了好几个面向CLR的语言编译器,包括,C++/CLI,C#,Visual Basic,F#,Iron Python,Iron Ruby以及一个中间语言(IL)汇编器。除了微软,另一些公司,学院和大学也创建了自己的编译器,它们也能面向CLR来生成代码。

无论使用哪一种编译器,结果都是一个托管模块,它是一个标准的PE32文件或PE32+文件。托管模块由4部分组成,PE32或PE32+头,CLR头,元数据,中间语言(IL)代码

本地代码编译器生成的是面向特定CPU架构的代码,而每个面向CLR的编译器生成的都是IL代码。IL代码有时称为托管代码,因为CLR要管理它的执行。

高级语言通常只公开了CLR所有功能的一个子集。然而,IL汇编语言允许开发人员访问CLR的所有功能。

为了执行包含托管代码或者托管数据的模块,最终用户必须在自己的计算机上安装CLR(.NET Framework的一部分)。C++编译器比较特殊,只有它才允许开发人员同时写托管和非托管代码,并生成到同一个模块中
C++编译器默认生成包含非托管(本地)代码的EXE/DLL模块,并在运行时操纵非托管数据(本地内存),这些模块不需要CLR即可运行。然而,制定一个/CLR命令行开关后,C++编译器就能生成包含托管代码的模块。当然,最终用户必须安装CLR才能执行这种代码。
只有C++编译器允许开发人员在源代码中同时定义托管和非托管数据类型,允许开发人员在托管代码中使用他们现有的本地C/C++代码,并在逐渐习惯之后开始使用托管类型。

程序集(Assembly)是一个或多个模块或资源文件的逻辑分组。在CLR的世界中,程序集相当于一个“组件”。
CLR操作的逻辑单元就是程序集,在程序集的所有文件中,有一个文件容纳了清单(manifest)。清单是一组元数据表的集合,表中主要包含了作为程序集的组成部分的那些文件的名称。此外,它们还描述了程序集的版本,语言文化,发布者,公开导出类型以及构成程序集的所有文件。
CLR总是首先加载包含“清单”元数据表的文件,再根据这个“清单”来获取程序集中的其他文件的名称。
程序集是可以由多个文件构成的,一些是含有元数据的PE文件,另一些是.gif或.jpg这样的资源文件。为了便于理解,可将程序集视为一个逻辑EXE或DLL。程序集将可重用类型的逻辑表示与物理表示分开了,程序集是进行重用,版本控制和应用安全性设置的一个基本单元。

遗憾的是,不能直接从Visual studio集成开发环境中创建多文件程序集。要创建多文件程序集,只能使用命令行工具。

命令行创建多文件程序集的例子:
假定有两个源代码文件,RUT.cs包含不常用的类型,FUT.cs包含常用的类型。

csc /t:module RUT.cs

C#编译器将编译RUT.cs,创建名为RUT.netmodule的标准PE文件,但是CLR不能单独加载它。

csc /out:JeffTypes.dll /t:library /addmodule:RUT.netmodule FUT.cs

C#编译器将编译FUT.cs,来生成JeffTypes.dll。由于指定了/t:library开关,所以生成的JeffTypes.dll是包含了清单元数据表的一个PE文件。/addmodule:RUT.netmodule开关告诉编译器,RUT.netmodule这个文件应被视为程序集的一部分。

名称空间完全独立于程序集,一个程序集中可以有不同的名称空间,同一个名称空间也可以分布在不同的程序集上。尽管程序集包含相同的名称空间,但没有相同的类名。

在开发期间,添加对程序集的引用,使之包含在程序集引用中,该类型的程序集就可以用于编译器。运行期间,只要实例化了一种类型的程序集,或者使用了该类型的一个方法,就会加载所引用的程序集。
除了这种自动操作之外,还可以通过编程加载程序集。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 分享人:傅云特邀嘉宾: 周振涛 原文出处: 链接:https://bbs.kafan.cn/thread-20...
    胡諾阅读 1,406评论 0 0
  • 昨天同事在部门分享中谈到了Android的虚拟机机制。正好想到我在学习.Net CLR的时候研究过CLR运行时的相...
    danejahn阅读 1,068评论 1 51
  • 基础 .NET概述 参考:http://www.cnblogs.com/yplong/p/3279934.html...
    donite阅读 1,609评论 0 8
  • 我寻着你的背影走过你走过的路看你看过的风景抬起头你的身影消失不见无人可再让我追逐那么我便成为你的影子拼尽一生去守护...
    约定星空阅读 299评论 0 4