[C++/CLI编程宝典][6]IL中间语言

[C++/CLI编程宝典][5]编译与反汇编 通过上次的第一个简单的C++/CLI实例,我们已经对C++/CLI的基本语法有了一定的认识,一些新的关键字也混了个眼熟。其实如果你有ISOC++背景,了解一些.NET相关概念,且使用VS2008 IDE开发的话,相信到现在你已经可以使用C++/CLI写一些简单的小程序了。本次继续上次的sample来深入了解它的编译和反编译。  1)编译 在安装了VS2008或WinSDK后,我们就拥有了很多的 阅读详情

 

继续上节的ildasm.exe对main.exe的IL中间语言的分析。我们知道我们在main.exe中定义了NativeClass,ValueStruct和RefClass。下面我们将做类型与IL中间语言的一一对应:

 

1)NativeClass

C++/CLI代码:

Code

 

IL中间代码:

NativeClass的定义:

上面我们看到了NativeClass的定义,他继承于System.ValueType,但是原本属于该类的成员现在都不在了,原因是ISOC++的class的成员被编译为IL中间代码后变为全局的静态成员,看下图:

2)ValueStruct

ValueStruct的定义:

Code

 

IL中间代码:(可以看到ValueStruct继承于System.ValueType)

3)RefClass

RefClass的定义:

Code

 

IL中间代码: (可以看到RefClass继承于System.IDisposable)

4)main函数

main函数代码:

 

Code

 

IL中间代码main的函数头(可以看到被编译为全局的静态函数):

具体的main实现:

 

.method assembly static int32 modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) 
        main() 
cil managed
{
  .vtentry 
1 : 1
  
// Code size       200 (0xc8)
  .maxstack  3
  
.locals (class RefClass V_0,
           valuetype NativeClass* V_1,
           
class [mscorlib]System.IDisposable V_2,
           valuetype NativeClass* V_3,
           valuetype NativeClass* V_4,
           valuetype NativeClass* 
modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst) V_5,
           
int32 V_6,
           
void* V_7,
           valuetype NativeClass* V_8,
           valuetype std.
'basic_string<char,std::char_traits<char>,std::allocator<char> >'modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst) V_9,
           valuetype std.
'basic_string<char,std::char_traits<char>,std::allocator<char> >'* V_10,
           valuetype ValueStruct V_11,
           valuetype std.
'basic_string<char,std::char_traits<char>,std::allocator<char> >' V_12)
  
IL_0000:  ldnull
  
IL_0001:  stloc.0
  
IL_0002:  ldc.i4.s   28
  
IL_0004:  call       voidmodopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) new(uint32)
  
IL_0009:  stloc.1
  .try
  {
    
IL_000a:  ldloc.1
    
IL_000b:  brfalse.s  IL_002b
    
IL_000d:  ldloca.s   V_12
    
IL_000f:  stloc.s    V_10
    
IL_0011:  ldloc.s    V_10
    
IL_0013:  ldsflda    valuetype '<CppImplementationDetails>'.$ArrayType$$$BY0BL@$$CBD modopt([mscorlib]System.Runtime.CompilerServices.IsConst) '?A0x3ea463b6.unnamed-global-1'
    
IL_0018:  call       valuetype std.'basic_string<char,std::char_traits<char>,std::allocator<char> >'modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) 'std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{ctor}'(valuetype std.'basic_string<char,std::char_traits<char>,std::allocator<char> >'modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst),
                                                                                                                                                                                                                                                          
int8 modopt([mscorlib]System.Runtime.CompilerServices.IsSignUnspecifiedByte) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)*)
    
IL_001d:  stloc.s    V_9
    
IL_001f:  ldloc.1
    
IL_0020:  ldloc.s    V_9
    
IL_0022:  call       valuetype NativeClass* modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) 'NativeClass.{ctor}'(valuetype NativeClass* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst),
                                                                                                                                        valuetype std.
'basic_string<char,std::char_traits<char>,std::allocator<char> >' modreq([mscorlib]System.Runtime.CompilerServices.IsCopyConstructed)*)
    
IL_0027:  stloc.s    V_5
    
IL_0029:  br.s       IL_002e
    
IL_002b:  ldc.i4.0
    
IL_002c:  stloc.s    V_5
    
IL_002e:  ldloc.s    V_5
    
IL_0030:  stloc.s    V_8
    
IL_0032:  leave.s    IL_003b
  }  
// end .try
  fault
  {
    
IL_0034:  ldloc.1
    
IL_0035:  call       void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) delete(void*)
    
IL_003a:  endfinally
  }  
// end handler
  IL_003b:  ldloc.s    V_8
  
IL_003d:  stloc.s    V_4
  
IL_003f:  ldloc.s    V_4
  
IL_0041:  call       void modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) NativeClass.Print(valuetype NativeClass* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst))
  
IL_0046:  ldloc.s    V_4
  
IL_0048:  stloc.3
  
IL_0049:  ldloc.3
  
IL_004a:  brfalse.s  IL_0057
  
IL_004c:  ldloc.3
  
IL_004d:  ldc.i4.1
  
IL_004e:  call       voidmodopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) NativeClass.__delDtor(valuetype NativeClass* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst),
                                                                                                                      uint32)
  
IL_0053:  stloc.s    V_7
  
IL_0055:  br.s       IL_005a
  
IL_0057:  ldc.i4.0
  
IL_0058:  stloc.s    V_7
  
IL_005a:  ldloca.s   V_11
  
IL_005c:  ldstr      bytearray (60 4F 7D 59 0C FF 11 62 2F 66 58 62 A1 7B 76 00   // `O}Yb/fXb.{v.
                                  61 00 6C 00 75 00 65 00 3C 50 7B 7C 8B 57 01 FF ) // a.l.u.e.<P{|.W..
  IL_0061:  call       instance void ValueStruct::.ctor(string)
  
IL_0066:  ldloca.s   V_11
  
IL_0068:  call       instance void ValueStruct::Print()
  
IL_006d:  ldstr      bytearray (60 4F 7D 59 0C FF 11 62 2F 66 58 62 A1 7B 72 00   // `O}Yb/fXb.{r.
                                  65 00 66 00 15 5F 28 75 7B 7C 8B 57 01 FF )       // e.f.._(u{|.W..
  IL_0072:  newobj     instance void RefClass::.ctor(string)
  
IL_0077:  stloc.0
  
IL_0078:  ldloc.0
  
IL_0079:  ldnull
  
IL_007a:  ldftn      void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) StartPrint()
  
IL_0080:  newobj     instance void RefClass/PrintDelegate::.ctor(object,
                                                                   
native int)
  
IL_0085:  call       instance void RefClass::add_StartPrint(class RefClass/PrintDelegate)
  
IL_008a:  ldloc.0
  
IL_008b:  ldnull
  
IL_008c:  ldftn      void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) EndPrint()
  
IL_0092:  newobj     instance void RefClass/PrintDelegate::.ctor(object,
                                                                   
native int)
  
IL_0097:  call       instance void RefClass::add_EndPrint(class RefClass/PrintDelegate)
  
IL_009c:  ldloc.0
  
IL_009d:  call       instance void RefClass::Print()
  
IL_00a2:  ldloc.0
  
IL_00a3:  ldstr      bytearray (60 4F 7D 59 0C FF 11 62 2F 66 58 62 A1 7B 72 00   // `O}Yb/fXb.{r.
                                  65 00 66 00 15 5F 28 75 7B 7C 8B 57 01 FF B0 73   // e.f.._(u{|.Ws
                                  28 57 63 6B 1A 90 C7 8F 70 00 72 00 6F 00 70 00   // (Wck.p.r.o.p.
                                  65 00 72 00 74 00 79 00 5E 5C 27 60 EE 4F 39 65   // e.r.t.y.^\'`.O9e
                                  10 62 58 54 66 00 65 00 69 00 6C 00 64 00 57 5B   // .bXTf.e.i.l.d.W[
                                  B5 6B 01 FF )                                     // .k..
  IL_00a8:  call       instance void RefClass::set_Str(string)
  
IL_00ad:  ldloc.0
  
IL_00ae:  call       instance void RefClass::Print()
  
IL_00b3:  ldloc.0
  
IL_00b4:  stloc.2
  
IL_00b5:  ldloc.2
  
IL_00b6:  brfalse.s  IL_00c3
  
IL_00b8:  ldloc.2
  
IL_00b9:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()
  
IL_00be:  ldc.i4.0
  
IL_00bf:  stloc.s    V_6
  
IL_00c1:  br.s       IL_00c6
  
IL_00c3:  ldc.i4.0
  
IL_00c4:  stloc.s    V_6
  
IL_00c6:  ldc.i4.0
  
IL_00c7:  ret
// end of method 'Global Functions'::main

 

读者可以将以上的源代码和IL对照,达到对IL的简单理解!

完!

Java基础之Java枚举 絮叨 昨天刚好有遇到一个枚举的小问题,然后发现自己并不是那么熟悉它,然后在开发中,枚举用的特别多,所以有了今天的文章。 什么是枚举 Java中的枚举是一种类型,顾名思义:就是一个一个列举出来。所以它一般都是表示一个有限的集合类型,它是一种类型,在维基百科中给出的定义是: 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠.。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MO 阅读详情

相关推荐

c&c++葵花宝典

此文档讲述了一些C/C++中一些小的知识点,这些知识点很多都是被我们所忽略的知识点;在工作中也许是要命的一小点

1.11 与非托管代码进行交互

.NET Framework比其他开发平台多提供了很多先进技术, 然而, 很少公司能承受起重新设计和重新实现所有的代码. 微软意识到这点, 因此构建了CLR来提供一种机制允许应用程序可以包含托管代码和非托管的代码. 特别地, CLR支持三种交互场景:Ÿ   托管代码可以调用DLL中的非托管的函数: 托管代码可以很容易地调哟哦能够包含在DLL中的函数, 这是通过使用一种称为P/Invoke (P

libright的专栏 1832

cpp-implementation:在现代C ++中实现的算法和设计模式

cpp实现 该存储库包含常用算法的现代C ++实现和23种设计模式。 演算法 它涵盖了基本的数据结构和算法: ; ; ; 设计模式 设计模式因其复杂性,详细程度和适用范围而异。 此外,可以按意图将它们分类并分为三组。 创作模式 这些模式提供了各种对象创建机制,这些机制增加了灵活性和现有代码的重用性: ; ; ; 建造者; 原型; 结构模式 这些模式说明了如何将对象和类组装为更大的结构,同时保持这些结构的灵活性和效率: 代理; 桥; 装饰器 适配器; 正面; 合成的; 轻量级; 行为模式 这些模式与算法以及对象之间的职责分配有关: 观察员; 模板方法; 战略; 责任链; 状态; 迭代器; 游客; 纪念; 命令; 口译员 调解员; 贡献 我们热爱贡献! 在提交“拉取请求”之前,最好先开始新一期。 执照 该库在Apache 2.0下获得许可。 完整

【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass、GeneratedClass、BlueprintClass、ParentClass进行比较深入的讲解,看完之后对蓝图会有全新的理解。本篇的内容很多很干货,同时学习起来有一定难度,建议看完我之前写的对UClass有关概念的讲解: 【UE·底层篇】一文搞懂StaticClass、GetClass和ClassDefaultObject 准备工作 首先先自定义一个UserWidget(MyUserWidget),然后新建两个UMG

水鸡的游戏开发学习笔记 7973

C/C++程序编译与链接(四) 创建动态库

其实站在开发者的角度,认为API与ABI是应该等价的,代码里的接口匹配,难道编译后,二进制文件中的接口对应的符号还不匹配吗?是的,对C++来说是要需要关注这些问题。

mo4776的博客 2142

将 .cs 文件 编译 成 dll

开始 -> 所有程序 -> mircosoft  visual studio 2005 -> visual studio tools ->  visual studio命令提示c:/Program Files/Microsoft Visual Studio 8/VC>csc /t:library /out:DB.dll D:/ASP.NET学习/DB/DBConn.cs

guowd的专栏 468

[C++/CLI编程宝典][7]基本概念

本次讲解一些基本的概念,中英文的对照: 1) Dynamic Link Library动态链接库/Assembly程序集 : Dynamic Link Library动态链接库,我们在ISOC++中知道,后缀为.DLL的文件为动态链接库,动态链接库实现了代码的组建级重用,但是当在CLI扩展后,与之对应的托管组建,我们称为Assembly程序集。程序集是 .NET Framework 应用程序的构

http://itech.cnblogs.com 951

.NET Framework 2.0 组件和非托管代码与交互操作详解(转)

.NET Framework 将促进与 COM 组件、COM+ 服务、外部类型库和许多操作系统服务的交互操作。在托管和非托管对象模型之间,数据类型、方法签名和错误处理机制都存在差异。为了简化 .NET Framework 组件和非托管代码之间的互用并便于进行移植,公共语言运行时将从客户端和服务器中隐藏这两种对象模型之间的差异。 在运行时控制下执行的代码称作托...

weixin_30954265的博客 404

[C# 基础知识系列]专题十五:全面解析扩展方法

引言:   C# 3中所有特性的提出都是更好地为Linq服务的, 充分理解这些基础特性后。对于更深层次地去理解Linq的架构方面会更加简单,从而就可以自己去实现一个简单的ORM框架的,对于Linq的学习在下一个专题中将会简单和大家介绍下,这个专题还是先来介绍服务于Linq的基础特性——扩展方法 一、扩展方法的介绍  我一般理解一个知识点喜欢拆分去理解,所以对于扩展方法的理解可以拆分为——首先...

weixin_33875564的博客 193

[C++/CLI编程宝典][3]C++/CLI能做什么

上次我们看了什么是C++/CLI,我们知道C++/CLI其实是包含了三部分:ISOC++,对CLI的.NET实现的扩展和前二者的无缝连接。本次继续上次,更近一层解释读者关心的三个问题:第一,使用C++/CLI我们可以做什么,它可以被使用在那些方面;第二,那些朋友需要学习C++/CLI;第三,学习C++/CLI需要哪些基础。1)使用C++/CLI我们可以做什么?对于C++/CLI可以做什么?我们可以...

weixin_33672400的博客 229

C++ namespace 使用梳理

发现 namespace 这个小细节在工作项目中处理的有一点点小混乱,于是稍微梳理了一下关于 C++ namespace 使用相关的使用内容,为日后项目的重构做准备,虽然是很小的点,但是也是值得注意的,毕竟代码的质量体现在每一个细节中。否则在项目代码中无组织,更容易造成理解上的困难。避免命名冲突:通过将代码组织在不同的namespace中,可以避免不同部分的代码使用相同的名称导致的冲突。提高代码的可读性和可维护性:使用namespace可以更清晰地组织代码,帮助开发人员更容易地理解和维护代码。

Chris_zhangrx的博客 1281

java native class_java中native使用的方法

一.什么是Native MethodJNI是Java NativeInterface的缩写,中文为JAVA本地调用。从Java 1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。一个Nativ...

weixin_39855568的博客 528
上一篇: [C++/CLI编程宝典][5]编译与反汇编
下一篇: [C++/CLI编程宝典][7]基本概念
itech_001
博客等级 码龄14年 75粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值