通过上次的第一个简单的C++/CLI实例,我们已经对C++/CLI的基本语法有了一定的认识,一些新的关键字也混了个眼熟。其实如果你有ISOC++背景,了解一些.NET相关概念,且使用VS2008 IDE开发的话,相信到现在你已经可以使用C++/CLI写一些简单的小程序了。本次继续上次的sample来深入了解它的编译和反编译。

1)编译

在安装了VS2008或WinSDK后,我们就拥有了很多的工具,其中Cl.exe就是用来编译C++代码的,对于Cl.exe的很多的选项可以查看msdn。这里结合上次的实例了解常用的选项,我们使用cl.exe /clr main.cpp来编译上次的实例,其中/clr选项表明要编译为托管的IL中间代码,因为我们知道ISOC++是可以直接编译为本地代码,main.cpp是我们要编译的C++文件名,其他的选项没有显式指定,使用默认。在执行次命令后会在与main.cpp相同的目录下产生main.obj和main.exe,且此时的main.exe是IL中间代码。编译过程如下图:

2)JIT编译

在上面我们看到main.cpp被编译连接后生成main.exe,我们知道exe是windows的可执行文件,但是上面的exe与我们传统的exe有所不同,这里的main.exe为IL中间语言的(IL中间语言我们可以先认为是一种高级的汇编语),它离真正的汇编语言还有一节距离,那么为什么IL中间语言的exe能够执行呢,这就要归功于.NET的虚拟机机制,当IL中间语言的exe运行的时候其实是要依赖于CLR先编译为真正的汇编代码的,然后再运行。

当IL中间语言的exe直接发布以后,用户第一次执行,会将IL中间语言编译为真正的汇编,我们将这个过程称为JIT(just in time)编译,JIT 编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是耗费时间和内存将可移植可执行 (PE) 文件中的所有 MSIL 都转换为本机代码,而是在执行期间根据需要转换 MSIL 并将生成的本机代码存储在内存中,以供该进程上下文中的后续调用访问。在加载并初始化类型时,加载程序将创建存根 (stub) 并将其附加到该类型的每个方法中。当首次调用某个方法时,存根 (stub) 会将控制权交给 JIT 编译器,后者会将该方法的 MSIL 转换为本机代码,并修改存根 (stub) 以使其直接指向生成的本机代码。这样,对 JIT 编译的方法的后续调用将直接转到该本机代码。

当然微软也发布了NGen.exe工具,你可以在安装过程中使用此工具将IL语言的exe先转化为真正的汇编代码,这样exe就和我们传统的exe一样了,没有运行时的第一次编译了。使用Ngen.exe编译后,生成了本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行库CLR从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。最好是把.dll ngen了,而不是exe,因为.exe的执行是由操作系统启动的,操作系统先通过EXE内部的一个固定函数启动clr,再将控制权交给CLR。下面是使用NGen.exe来产生main.exe的本地映像的实例:

3) JIT与NGen.exe比较

JIT运行时编译,NGen.exe在运行前编译;JIT每次编译需要的方法,NGen.exe一次编译整个程序集;JIT将编译后存在内存中,NGen.exe编译后持久地存储在本地的磁盘上;JIT 编译器生成的代码会绑定到触发编译的进程上,不能多进程间共享,NGen.exe可以多进程间共享已经编译好的代码。

4)反IL中间语言

C++/CLi是架构于CLI之上,使用IL作为中间抽象层,我们的C++/CLI代码被编译为IL中间语言,从IL中间语言到底层的汇编CLR帮我们做好了,对于我们开发人员就像是系统的底层提升到了IL中间语言层,所以我们只要关心到IL中间语言就好了,而IL中间语言又跟我们的高级语言非常相似,大大降低了我们理解底层的难度。所以标题中提到的反汇编,现在就转为了反IL中间语言了,下面使用另一个工具ildasm.exe来将刚才的main.exe反IL中间语言,使用命令ildasm main.exe如下图:

运行命令后打开ildasm窗口如下:

在ildasm窗口中,我们看到我们NativeClass,ValueStruct和RefClass的定义,这些就是CLI的IL中间语言。下节深入编译后的IL中间语言!

完!

[C++/CLI编程宝典][5]编译与反汇编相关推荐

  1. c语言入门自学宝典,c语言学习编程宝典下载-c语言学习编程宝典appv1.2 - 起点软件园...

    c语言学习编程宝典是主打学习编程的软件,里面有海量的编程学习资源让你选择,帮助你更好的学习C语言,非常的高效,还有名师为你指导,很适合需要的小伙伴们进行学习体验. c语言学习编程宝典说明 1.将C语言 ...

  2. WPF编程宝典--XAML

    WPF编程宝典--XAML 写在前面 InitializeComponent() 硬件加速 关于属性 复杂属性 附加属性 嵌套元素 写在结尾 写在前面 从这篇文章开始,我们将正式走入WPF的学习,但是 ...

  3. CUDA C++编程接口:编译

    CUDA C++编程接口:编译 一.概述 CUDA C++为熟悉C++编程语言的用户提供了一个简单的路径,以方便地编写程序以执行该设备. 它由一组最小的扩展到C++语言和运行库. 在编程模型中引入了核 ...

  4. unix环境高级编程 pdf_UNIX系统编程宝典,每一本都值得程序员珍藏

    这几本UNIX系统编程宝典,重印无数次,几代程序员都视如珍宝的几本书,小编在出版圈里快十年了,见证了这本书图灵版.异步社区版的出版.营销,对这套书倾注了一定的感情.今天继续分享给你们,好书总会有人还不 ...

  5. C 语言编程 — 程序的编译流程

    目录 文章目录 目录 文章目录 C 程序的编译流程 预处理 编译 汇编 链接 编译多个源文件 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程序的编译流程> ...

  6. GUI编程与CLI编程

    作为一名多年的iOS开发人员,多次触发我思酌"GUI编程与CLI编程"各自的优劣,尤其是在当我为界面交互花费大占比时间时,时常怀疑自己的工作性质,我终究还是为互联网工作的码农,而不 ...

  7. c语言编程宝典pdf,C语言编程宝典之一.pdf

    C语言编程宝典之一 作者:王大刚 本人的<FOXPRO编程宝典之一>,<FOXPRO编程宝典之二>和<FOXPRO 编程宝典之三>系列软件在<电脑报>配 ...

  8. Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...

    前言 大家都知道并发编程技术就是在同一个处理器上同时的去处理多个任务,充分的利用到处理器的每个核心,最大化的发挥处理器的峰值性能,这样就可以避免我们因为性能而产生的一些问题. 大厂的核心负载肯定是非常 ...

  9. 单片机编程软件很简单(17),Keil单片机编程软件之编译、链接

    单片机编程软件使用较多,诸多朋友大学期间便接触单片机编程软件.因此,大家对于单片机编程软件或多或少有所了解.本文中,将对Keil单片机编程软件加以介绍,主要在于介绍如何在这款单片机编程软件中进行项目设 ...

最新文章

  1. angularjs的双向绑定原理实现
  2. python中一个范围怎么表示_我应该如何处理Python中的包含范围?
  3. Python基本数据类型(二)
  4. file.seek()/tell()-笔记
  5. 十进制大数的加法运算
  6. 湖北大学计算机袁云,暑期走访不停歇 远赴异地送关怀——学校慰问离退休教职工和校友...
  7. 浅析调用android的content provider(一)
  8. axios请求失败,response.data返回的状态码及错误信息获取
  9. labelme也可以标注polygan
  10. Java基础continue语句
  11. 详解Java的IO流Part7:PrintStream打印流【完结】
  12. 利用PDM实现机械制造业的信息集成
  13. c语言ax2bxc0的求根公式,ax2+bx+c=0的求根公式
  14. 用python读取YUV文件 转RGB 8bit/10bit通用
  15. mysql脏页处理方法_mysql刷脏页的一次总结
  16. java put 语句_Java put语句
  17. 【笔试】中移物联网重庆公司
  18. Netty 警告 The pipeline contains no upstream handlers; discarding:
  19. css背景图像属性_如何将CSS3转换应用于背景图像
  20. 【Rust日报】 2019-01-26

热门文章

  1. 安装Visual Studio 2005 SP1时遇到1718错误
  2. AjaxPro无刷新选择列表框/下拉框[方便|稳定]
  3. 黑客攻防技术宝典Web实战篇第2版—第10章 测试后端组件
  4. Rabbitmq 1.消息如何保障 100%投递成功?
  5. jvm面试2 jvm如何加载java代码? JVM知识重点:内存模型和GC
  6. Java生产环境下性能监控与调优详解 第4章 基于Btrace的监控调试
  7. 微信小程序字符长度超出变成神略号显示
  8. shell写入文件,后面会覆盖前面
  9. 打开c语言运行不了_C语言——菜鸟和大神的分水岭:内存、线程、进程
  10. 【MyBatis框架】订单商品数据模型-分析思路