C++ CLI简介(什么是C++ CLI)
要知道C++/CLI是什么,首先知道什么是CLI。
一、CLI简介
CLI:(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环境的规范。更通俗的我们可以说它是一个虚拟平台,是操作系统和应用程序间的一层抽象。微软的.NET的基础CLR(Common Language Runtime,通用语言运行时)就是CLI的一个实例。
CLI主要的组成部分有:CTS,Metadata,CLS和VES。
★ CTS(Common Type System,通用类型系统):是CLI的基础,它是一个类型规范,定义了所有CLI平台上可以定义的类型的集合,所有基于CLI的语言类型都是CTS的一个子集,目前C++/CLI是对CTS描述支持最好的高级语言。
★ Metadata(元数据):用来描述和引用CTS定义的类型,元数据以一种独立于任何语言的形式存储,正是元数据赋予了组建自描述的能力。
★ CLS(Common Language Specification,通用语言规范):是用以确保所有CLI语言能够互操作的一组规则,它定义了所有CLI语言都必须支持的一个最小功能集(一个CTS的子集)。各CLI语言可以选择自己对CTS的一部分的映射,但是为了确保不同语言的交互,至少应该支持CLS所定义的最小功能集。
★ VES(Virtual Execution System,虚拟执行系统):为CLI程序提供了一个在各种可能的平台上加载和执行托管代码的虚拟机环境,只是一个规范,比如微软和momo就各有自己的实现。.NET的CLR的JIT和GC应该属于此范围。
.NET Framework是微软对CLI的一个实现,当然也是目前最好的实现,.NET Framework主要包含CLR和BCL,CLR(实时通用语言)是核心也即CLI的实现,BCL是一套通用的代码库,可以被所有的.NET语言(C#, VB.NET, C++/CLI)程序所使用。Visual C++2005是C++/CLI的实现。
二、什么是C++/CLI
其实C++/CLI除了包含ISOC++和CLI扩展,它之所以强大的更重要的原因就是它实现了ISO C++和.NET的无缝连接。C++/CLI支持对本地ISO C++编程和.NET托管编程的无缝集成,不是简单的混合,不仅能够像.NET调用windows API一样通过P/Invoke来实现函数互调,而且可以实现类型class级和ISO C++和.NET类库的相互使用,更强的是能够实现类型的混合。为了实现无缝连接,绝大多数的以前的ISO C++代码编译后将得到托管代码,部分不能编译为托管IL的采用P/Invoke调用实现。代码托管,但是数据并不托管,原来ISO C++中本地堆内的数据仍位于本地堆中。
C++/CLI(CLI:Common Language Infrastructure)是一门用来代替C++托管扩展(下文使用MC++指代)新的语言规范。重新简化了C++托管扩展的语法,提供了更好的代码可读性。和微软.NET的其他语言一样,微软向ECMA提交了C++/CLI的标准。C++/CLI现在可以在Visual C++ 2005上开发。C++/CLI的部分特性已经申请了专利。
三、C++/CLI给我们提供了什么?
① 优雅流畅的语法和文法–C++/CLI为C++开发人员书写托管代码提供了一种非常自然的感觉,并且它提供了非托管代码到托管代码的平滑过度。以前所谓的"双重底线"问题现在已经荡然无存。
② 一流的CLI支持–CLI特色,例如属性、碎片集合和属类得到了直接支持,此外,C++/CLI还准许将这些特色用于本地非托管的类。
③ 一流的C++类支持–C++特色,例如模板和析构函数对于拖管和非拖管类继续有效。实际上,C++/CLI是你可以"表面上"在栈或C++本地堆上声明一个.NET类型唯一的.NET语言。
④ 在.NET与C++之间的沟壑上架起了一座桥梁–C++开发人员在抨击BCL时不再象离开水的鱼。
⑤ C++/CLI编译器产生的可执行文件完全是可校验的。
四、使用C++/CLI我们可以做什么
可以简单的从它所包含的三部分内容来解释:
① ISO C++是C++/CLI对CLI扩展的基础,C++/CLI对以前的ISO C++部分完全进行了保留,完全兼容,所以ISO C++可以做的,现在C++/CLI仍然可以继续,那有人说这个就是ISO C++,那么我也告诉你是C++/CLI, 因为它是被编译为IL代码,这时我们可以用来开发游戏和图形处理软件等,但是如果是要开发系统或底层,这时需要将代码编译为本地代码,其实这时的C++/CLI就是ISO C++了;
② 对CLI的.NET实现的扩展,这部分我们可以充分地使用.NET所带来的优势,比如庞大的类库和高效的UI快速开发能力;
③ ISO C++和.NET的集成,通过这部分,更好地补充了以前的本地代码和.NET代码的交互的能力,降低的集成的难度,使得可以更加充分地利用各语言和开发人员的优势。
五、学习C++/CLI所需要的基础
C++/CLI包含了ISO C++和对其的.NET的扩展,看这两部分,一个是ISO C++,另一个是在.NET的扩展,可见基础就是ISO C++,这也正是我这里指出的本系列所要求的基础。
前面虽然提到C++/CLI包含ISO C++和其扩展,但是考虑到ISO C++是个很大的内容和已经存在有大量的书籍介绍,所以本系列着重介绍ISO C++对.NET的扩展部分。
C++/CLI:是静态C++对象模型到CLI的动态组件对象编程模型的捆绑,或者说C++/CLI是ISOC++在.NET的扩展,是ISOC++和.NET的无缝结合。简而言之,它就是你如何用C++在.NET中编程,而不是C#或Visual Basic .net。
C++ CLI简介(什么是C++ CLI)的更多相关文章
- VC++ 学习笔记(三):摩登之路——C++/CLI简介
在Windows上,除非我们必须得用C++来写界面,否则我会选择避免,避免学习和使用MFC.替代的方案是用C#来做界面,然后用C++/CLI来连接C#和Native C++.那么问题来了,C++/CL ...
- Apache Commons CLI 简介
CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被 ...
- .Net Core CLI在CentOS7的安装及使用简介
1. 安装libunwind cd /usr/local/src wget http://download.savannah.gnu.org/releases/libunwind/libunwind- ...
- 用C++/CLI搭建C++和C#之间的桥梁(一)—— 简介
C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于访问底层模块和 ...
- php cli模式学习(PHP命令行模式)
http://www.jb51.net/article/37796.htm php_cli模式简介 php-cli是php Command Line Interface的简称,如同它名字的意思,就是 ...
- Apache Commons CLI 开发命令行工具示例
概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...
- 托管C++、C++/CLI、CLR
1.什么是托管C++? 在回答这个问题,首先要搞清楚什么是"托管"(Managed).托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完 ...
- 使用 Apache Commons CLI 开发命令行工具示例
Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...
- 使用 Apache Commons CLI 解析命令行参数示例
很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...
随机推荐
- 浅谈MVC设计模式
摘要:MVC即Model.View.Controller即模型.视图.控制器,它是用一种业务逻辑.数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用 ...
- [刘阳Java]_easyui-draggable拖动组件_第4讲
easyui-draggable的拖动组件还是比较好用的,它能够快速地实现网页中元素的拖动效果 实现easyui-draggable拖动组件有两种方式:纯HTML方式和JS方式 纯HTML方式实现拖动 ...
- 一:Vue项目构建
第一步:需要安装nodeJS的环境,直接去官网下载https://nodejs.org/en/,下载下来按照提示一步步的安装.(vue.js是一个Js 框架.在node里面通过Npm 安装,是为了方便 ...
- python + Excel数据读取(更新)
data.xlsx 数据如下: import xlrd#1.读取Excel数据# table = xlrd.open_workbook("data.xlsx","r&qu ...
- 如何在VeryCD中下载资源
这个方法也是百度来的,记在这里的目的不是为了显摆,主要是担心自己大脑记不住,用的时候又要重新找方法. 操作系统:Linux Mint 17 首先,在VeryCD中看好了某个资源,比如搜索的<哈利 ...
- sql注入之类型及提交注入
#参数类型 这里说的参数是源码中存在注入的地方. 其中参数类型有:数字.字符.搜索.json等. 其中sql语句干扰符号有:',",%,),}等,过滤首先考虑闭合这些符号,再进行注入测试. ...
- create-react-app 创建的项目执行npm run eject后,运行报错
create-react-app 创建的项目执行npm run eject后,运行报错:Cannot find module '@babel/plugin-transform-react-jsx-so ...
- 看视频学Bootstrap—在微软虚拟学院学习Bootstrap
Bootstrap 是目前最流行的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB项目. 如果您希望在几个小时内对Bootstrap有一个直观的了解,观看微软虚拟学院(M ...
- ajax()返回Array
后台查询的数据为数组$arr,需要将数组 echo json_encode($arr);前台ajax拿到数据 然后用 eval("(+data+)"); 来将json转为json对 ...
- 为什么大家都在用WebRTC?
WebRTC代表网络实时通信.它是一种非常令人兴奋,强大且具有高度破坏性的尖端技术和标准.自从WebRTC诞生以来,80%的浏览器都开始支持它.有数据显示,2017年~2021年期间,WebRTC市场 ...