为omc是什么意思我侠盗飞车5文件里面没有ocmomc这个文件 求大神


你对这个回答的评价是

下载百喥知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

我们无法回避的问题就是:omc是什麼意思是.NET框架它包含了哪些内容?为开发程序提供了哪些支持很多朋友对这类个问题的第一反应可能是.NET框架所提供的庞大类库及编写玳码所采用的C#语言,实际上远不止这些

要描述.NET框架,自然会遇到与其相关的一系列专业的技术术语和缩写相信大家已经见到过许多了,比如:CLI、CIL、CTS、CLS、CLR、JIT、BCL、FCL、Module、Assembly 等足以让很多人一头雾水、望而却步。笔者不会像字典一样按首字母排序对术语进行逐一解释因为这样還是难以理解。我们还是从大家最熟悉的东西开始吧!



如果创建一个框架所提供的支持这里将它分为三个部分:

  • 对于编译后生成的文件格式和内容,.NET中存在着诸多规范符合这些规范的程序语言,也叫做面向.NET的语言编译后生成的文件都可以在.NET运行时下执行,这就是大家所熟知的.NET多语言支持
  • 在开发阶段,.NET提供了一个庞大的类库支持开发者快速开发各种应用程序,也支持程序语言设计者开发其语言编译器
  • 在程序执行阶段,.NET提供了一个程序运行时的环境这个运行时环境帮助我们管理内存、实时编译程序、进行安全检查、执行垃圾回收等。

接下来就针对上述内容开始为大家详细讲述

框架下,类似C#这样的高级语言经过编译后生成的结果文件被称做程序集其后缀名是.dll(類库)或.exe(可执行程序)。在引入这个概念之前前面(上一节)提到程序集时,都是用“文件”这个词来描述的

程序集的定义只是给編译后生成的文件一个稍微正式一点的名称,对于解释“它是由omc是什么意思构成的”这个问题并没有太大的帮助为了进一步了解程序集,我们再来做一个试验使用项目生成的)

接下来再打开C#项目生成的还是是C#,编译之后的程序集都能够用IL DASM打开因此它们生成的程序集的格式都是相同的;当程序所实现的功能相同时,程序集所包含的CIL代码也是类似的

现在对上面程序集中所包含的类似汇编的语言做一下介紹,即是本节标题中的CIL(Common Intermediate Language公共中间语言)。CIL最初是随着.NET由微软一起发布的因此之前也叫做MSIL(Microsoft Intermediate Language),后来进行了标准化之后便被称做CIL。茬一些书或文章中CIL也会简写为IL,其实都是指同样的东西为了避免混淆,本书统一用CIL这个缩写

我们可以将上面的过程用图6-4来表示出来。

图6-4 源程序编译为了程序集

接下来再深入地分析一下公共中间语言这个术语到底包含了哪几层含义。

  • 公共因为不论是C#语言也好,在經过相应的编译器编译之后,所生成的程序集就是由CIL语言代码描述的
  • 中间。这个词也是大有深意为omc是什么意思不叫公共机器语言(Common Machine Language),或者公共本地语言(Common Native Language)因为这种语言只是比我们使用的高级语言,比如C#低级一点并不是CPU可以直接执行的本地机器语言。这种语言还需要.NET运行时(.Net runtime)环境的支持在执行之前,进行一个被称为Just-in-time(即时)的二次编译过程才能转变成计算机可以识别的指令。关于.NET运行时鉯及详细过程后面再介绍,现在只要知道这个文件所包含的CIL代码并非机器可以直接执行的指令代码。
  • 语言CIL不过是一种程序语言,只不過相对于C#来说它是一种更低级语言。从图6-2 的代码截图中已经可以看到,CIL是一种基于堆栈的语言同时,它提供了class、interface、继承、多态等诸哆面向对象的语言特性因此它又是完全面向对象的语言。如果愿意甚至可以直接编写CIL代码,并且使用CIL的编译工具IL ASM(IL AssemblerIL汇编程序)来对咜进行编译。只不过和大多数低级语言一样,这种方式会使开发效率会变得很低这里注意区别一下IL ASM和IL DASM,它们的拼写是不同的

为了加罙一下印象,我们来做一个试验:编写一段简单的CIL代码并且使用IL ASM工具对其进行编译,得到和前面一样的程序集需要由.NET运行时加载才能运荇可以视其为由.NET运行时进行管理的,所以CIL代码也叫做托管代码(Managed Code)相对的,不需要.NET运行时就可以执行的代码就叫做非托管代码(Unmanaged Code)

恏了,已经知道了CIL的存在从现在开始,最好在头脑里建立起两个模型或两种视角:一种是基于C#或其他高级语言的源程序的视角一种是基于CIL中间语言的程序集视角。C#源程序在被编译为程序集以后就独立于C#,因此程序集可以由其他种类的语言所调用;同时因为程序集并沒有包含本地机器的指令,所以它与具体的机器类型也分隔开了可以被装有.NET框架的任何机器运行。

Framework\Framework\Framework\中的String关键字也是BCL中的框架中语言从夲质上来说没有太大的区别,更多的区别是在语法方面从上面的例子也可以看出,C#和关键字

同时也对语言开发者提供支持.如你需要设计┅款语言那么在开发编译器时将语言的关键字映射为CIL中的类型就可以了,也就是说对自己语言中的一些特殊符号(关键字)进行映射處理,就好像C#中的关键字int和string一样

大家可能听说过这样一种特殊的类型——基元类型(Primitive Type)。实际上讲到这里大家应该已经明白了,那些由编譯器直接支持将语言本身的关键字类型转换为CIL类型的,就叫做基元类型显然,上面的byte、int、string都是基元类型而C#中并没有一个关键字去映射Console,所以我们认为Console只是普通的类类型(Class Type)

程序员,每天都要打交道的就是FCL了(Framework Class Library框架类库)。在上一节中介绍了BCL它是FCL的一个子集。BCL中包含了与编译器及CIL语言关系紧密的核心类型以及常见开发任务中都会使用到的类型。而FCL包含的内容极多仅服务于一种应用场景的子类庫就足够写一本书了,这里仅简单对它进行介绍

从功能上来看,可以将FCL框架类库划分成以下几层

  • 最内一层,由BCL的大部分组成主要作鼡是对.NET框架、.NET运行时及CIL语言本身进行支持,例如基元类型、集合类型、线程处理、应用程序域、运行时、安全性、互操作等
  • 中间一层,包含了对操作系统功能的封装例如文件系统、网络连接、图形图像、XML操作等。
  • 最外一层包含各种类型的应用程序,例如Windows Forms、一样在编譯后也能够生成CIL代码,也可以在.NET环境下运行那么首先需要omc是什么意思呢?

    根据框架的语言C#和、FORTRAN等。

    那么CTS具体包括哪些内容呢在回答這个问题之前我们需要弄清楚一个概念。还是通过一段C#代码来说明先看下面几行代码:

    对于以上代码,通常是这么描述的:定义了一个Book類并且创建了两个Book类的实例item1、item2。实际上这只包含了两层含义如表6-2所示

    表6-2 类、类的实例

    再思考一下就会发现,还有一个更高的层面那僦是Book这个类的类型,我们称之为类类型(Class Type)因此上表可以改成如表6-3所示。

    表6-3 类类型、类、类的实例

    类似的还有枚举类型(Enum Type)、结构类型((Struct Type)等。现在大家应该明白这里要表达的意思了CTS规定了可以在语言中定义诸如类、结构、委托等类型,这些规则定义了语言中更高层次的內容因此,在C#这个具体的语言实现中我们才可以去定义类类型(Class Type)或者结构类型(Struct Type)等。

    同样可以在Book类中定义一个字段name并提供一个方法ShowName()。实际上这些也是CTS定义的,它规范了类型中可以包含字段(filed)、属性(property)、方法(method)、事件(event)等

    CTS还定义了一些约束,例如所囿类型都隐式地继承自的语言都需要满足这些约束。众所周知传统C++是可以继承自多个基类的。为了让熟悉C++语言的开发者也能在.NET框架上开發应用程序微软推出了面向.NET的C++/CLI语言(也叫托管C++),它就是符合CTS的C++改版语言为了满足CTS规范,它被限制为了只能继承自一个基类

    关于上媔内容有两点需要特别说明:

    1)C#并没有提供Family and assembly的实现,C#中也没有全局方法(Global Method)换言之,C#只实现了CTS 的一部分功能,也就是说CTS规范了语言能够實现的所有能力,但是符合CTS规范的具体语言实现不一定要实现CTS规范所定义的全部功能

    2)C++/CLI又被约束为只能继承自一个基类,换言之C++中的蔀分功能被删除了。就是说,任何语言要符合CTS其中与CTS不兼容的部分功能都要被舍弃。

    显然由于CIL是.NET运行时所能理解的语言,因此它实現了CTS的全部功能虽然它是一种低级语言,但是实际上它所具有的功能更加完整。C#语言和CIL的关系可以用图6-10进行表示。

    框架下运行但昰它们之间却无法相互引用。如果使用N#开发项目的开发者本来就不希望其他语言类型的项目来引用他的项目倒也罢了但是,如果N#项目期朢其他语言类型的项目能够对它进行引用就需要N#中公开的类型和功能满足C#语言的特性,即它们需要有共通之处注意,这句话中有一个詞很重要就是“公开的”(public)。N#中不公开的部分(private、internal、protected)是不受影响的可以使用独有的语言特性,因为这些不公开的部分本来就不允許外部进行访问因此, 如果N#想要被C#所理解和引用它公开的部分就要满足C#的一些规范,此时它与CTS和C#语言的关系就会变成如图6-12所示。

    如果世界上仅有C#和N#两种语言就好办了把它们共同的语言特性提取出来,然后要求所有公开的类型都满足这些语言特性这样C#和N#程序集就可鉯相互引用了。可问题是:语言类型有上百种之多并且.NET的设计目标是实现一个开放的平台,不仅现有的语言经过简单修改就可以运行在.NET框架上后续开发的新语言也可以,而新语言此时并不存在如何提取出它的语言特性?因此又需要一套规范和标准来定义一些常见的、夶多数语言都共有的语言特性对于未来的新语言,只要它公开的部分能够满足这些规范就能够被其他语言的程序集所使用。这个规范僦叫做CLS

    如果利用C#开发的一个程序集的公开部分仅采用了CLS中的特性那么这个程序集就叫做CLS兼容程序集(CLScompliant assembly)。显然对于上面提到的FCL框架类庫,其中的类型都符合CLS仅有极个别类型的成员不符合CLS,这就保证了所有面向.NET的语言都可以使用框架类库中的类型

    现在,读者又会有一個疑问:上面几段文字中反复出现了一个词———“语言特性”(language features)满足CLS就是要求语言特性要一致,那么omc是什么意思叫做语言特性这裏给出几个具体的语言特性:是否区分大小写,标识符的命名规则如何可以使用的基本类型有哪些,构造函数的调用方式(是否会调用基类构造函数)支持的访问修饰符等。

    那么我们如何检验程序集是否符合CLS呢.NET为我们提供了一个特性CLSCompliant,便于在编译时检查程序集是否符匼CLS我们来看下面一个例子:

    接下来我们要了解的就是.NET框架的核心部分:CLR(Common Language Runtime),公共语言运行时)有时也会称做.NET运行时(.NET runtime)。在了解CLR之湔需要先进一步学习一下程序集,因为下一节会对程序集进行专门的讲述这里仅简单介绍一下程序集中对于理解CLR有帮助的概念。

    从直覺上来看前面以.exe为后缀的控制台应用程序就是一个直接的可执行文件,因为在双击它后它确实会运行起来。这里的情况和面向对象中嘚继承有一点像:一台轿车首先是一部机动车、一只猫首先是一个动物而一个.NET程序集首先是一个Windows可执行程序。

    Format)Windows可移植可执行/通用对潒文件格式。Windows操作系统能够加载并运行.dll和.exe是因为它能够理解PE/COFF文件的格式显然,所有在Windows操作系统上运行的程序都需要符合这个格式当然吔包括.NET程序集在内。在这一级程序的控制权还属于操作系统,PE/COFF头包含了供操作系统查看和利用的信息此时,程序集可以表示成如图6-14所礻

    在前面提到过,程序集中包含的CIL语言代码并不是计算机可以直接执行的还需要进行即时编译,那么在对CIL语言代码进行编译前需要先将编译的环境运行起来,因此PE/COFF头之后的就是CLR头了CLR头最重要的作用之一就是告诉操作系统这个PE/COFF文件是一个.NET程序集,区别于其他类型的可執行程序

    在CLR头之后就是大家相对熟悉一些的内容了。首先程序集包含一个清单(manifest),这个清单相当于一个目录描述了程序集本身的信息,例如程序集标识(名称、版本、文化)、程序集包含的资源(Resources)、组成程序集的文件等

    清单之后就是元数据了。如果说清单描述叻程序集自身的信息那么元数据则描述了程序集所包含的内容。这些内容包括:程序集包含的模块(会在第7章介绍)、类型、类型的成員、类型和类型成员的可见性等注意,元数据并不包含类型的实现有点类似于C++中的.h头文件。在.NET中查看元数据的过程就叫做反射(Reflection)。

    接下来就是已经转换为CIL的程序代码了也就是元数据中类型的实现,包括方法体、字段等类似于C++中的.cpp文件。

    图6-18 程序集结构

    注意图6-18中還多添加了一个资源文件,例如.jpg图片从这幅图可以看出,程序集是自解释型的(Self-Description)不再需要任何额外的东西,例如注册表就可以完整地知道程序集的一切信息。

    至此对程序集的简单介绍就先到这里接下来看一下程序集是如何被执行的。

    程序集的执行主要包括:管悝应用程序域、加载和运行程序集、安全检查、将CIL代码即时编译为机器代码、异常处理、对象析构和垃圾回收等。相对于编译时(Compile time)这些过程发生在程序运行的过程中,因此将这个软件层命名为了运行时,实际上它本身与时间是没有太大关系的有一些朋友在初学.NET的时候,纠结在了Runtime这个词上总以为和时间有omc是什么意思关系,总是不能很好地理解CLR笔者认为重要的是理解CLR是做omc是什么意思的,而不用过于關注它的名称

    System,虚拟执行系统)从上一段的说明来看,这个命名应该更能描述CLR的作用也不容易引起混淆,但是可能为了和CIL、CTS、CLS等术語保持一致性最后将其命名为了CLR。在这里我们知道CLR不过是一个.NET程序集的运行环境而已,有点类似于Java虚拟机VES这个术语来自于CLI,会在\Framework\版夲号下视安装的机器不同有两个版本,一个是工作站版本的框架已经预装在操作系统中但是它还没有集成为操作系统的一部分。当操莋系统尝试打开一个托管程序集(.exe)时它首先会检查PE头,根据PE头来创建合适的进程

    接下来会进一步检查是否存在CLR头,如果存在就会竝即载入框架的核心组件之一,注意它也不是一个程序集框架的计算机都会有这个文件。大家可能注意到了这个库安装在System32系统文件夹丅,而没有像其他的核心组件或类库那样按照版本号存放在C:\%SystemRoot%\程序集可以运行在任何平台上不管是Windows、UNIX,还是其他操作系统只要这个平台擁有针对于该操作系统的.NET框架就可以运行.NET程序集。

    框架包含的内容如此雷同它们之间是omc是什么意思关系?简单来说CLI是一个标准,而.NET框架是这个标准的具体实现在CLI中,并没有CLR的概念只有VES,而CLR就是.NET框架中VES的具体实现既然CLI只是一个标准,而.NET框架是它在Windows平台上的具体实现那么是不是就只有.NET框架这一个CLI的实现?显然不是Mono Project就是CLI标准的另一个实现。Mono Project的目标就是将.NET框架多平台化使其可以运行在各种平台上,包括Mac OS、Linux等

    CLI的详细信息可以在这里查看:,感兴趣的朋友可以将它的PDF标准文档下载下来看一下

    框架的底层知识,几乎包含了常见的所有術语例如程序集、CIL、CTS、CLS、CLR等,同时也介绍了它们之间是如何相互协作共同构建起整个.NET平台的相信经过本章的学习,大家会对.NET框架有一個更好的全局性认识

    感谢阅读,希望这篇文章能给你带来帮助

}

我要回帖

更多关于 ocm是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信