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

 

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

 

1)NativeClass

C++/CLI代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
// 1 ISOC++
public class NativeClass
{
public:
    NativeClass(std::
string str)
    {
        m_str 
= str;
        std::cout 
<< "ISOC++ 本地类型构造!" << std::endl;
    }
    
~NativeClass()
    {
        std::cout 
<< "ISOC++ 本地类型析构!" << std::endl << std::endl;
    }
    
void Print()
    {
        std::cout 
<< m_str << std::endl;
    }
private:
    std::
string m_str;
};

 

IL中间代码:

NativeClass的定义:

2009010722304218.png

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

2009010722374529.png

2)ValueStruct

ValueStruct的定义:

ContractedBlock.gif ExpandedBlockStart.gif Code
// 2 C++/CLI
value struct ValueStruct
{
    System::String
^ m_str;
    ValueStruct(System::String
^ str)
    {
        m_str 
= str;
        System::Console::WriteLine(
"托管value值类型构造!");
    }
    
// 不能有析构函数
    
//~ValueStruct()
    
//{
    
//    System::Console::WriteLine("托管value值类型析构!");
    
//}
    void Print()
    {
        System::Console::WriteLine(m_str);
    }
};

 

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

2009010722390534.png

3)RefClass

RefClass的定义:

ContractedBlock.gif ExpandedBlockStart.gif Code
// 3 C++/CLI
ref class RefClass
{
public:
    RefClass(System::String
^ str)
    {
        m_str 
= str;
        System::Console::WriteLine();
        System::Console::WriteLine(
"托管ref引用类型构造!");
    }
    
~RefClass()
    {
        System::Console::WriteLine(
"托管ref引用类型析构!");
        System::Console::WriteLine();
    }
    
void Print()
    {
        StartPrint();
        System::Console::WriteLine(m_str);
        EndPrint();
    }

    
// 属性property,委托delegate和事件event
    property System::String^ Str
    {
        System::String
^ get() { return m_str; }
        
void set(System::String^ str) { m_str = str; }
    }

    
delegate void PrintDelegate(void);
    
event PrintDelegate^ StartPrint;
    
event PrintDelegate^ EndPrint;

private:
    System::String
^ m_str;    
};

 

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

2009010722405079.png

4)main函数

main函数代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
void StartPrint()
{
    System::Console::WriteLine(
"Print开始事件,马上开始Print函数调用!");
}
void EndPrint()
{
    System::Console::WriteLine(
"Print结束事件,Print函数调用结束!");
}

void main()
{
    NativeClass
* pNC = new NativeClass("你好,我是ISOC++本地类型!");
    pNC
->Print();
    delete pNC;

    ValueStruct vs(
"你好,我是托管value值类型!");
    vs.Print();
    
    RefClass
^ hRC = gcnew RefClass("你好,我是托管ref引用类型!");
    hRC
->StartPrint += gcnew RefClass::PrintDelegate(StartPrint);
    hRC
->EndPrint += gcnew RefClass::PrintDelegate(EndPrint);
    hRC
->Print();
    hRC
->Str = "你好,我是托管ref引用类型!现在正通过property属性修改成员feild字段!";
    hRC
->Print();
    delete hRC; 

}

 

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

2009010809430523.png

具体的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         void modopt ([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         void modopt ([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}Ydot.gifb/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}Ydot.gifb/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}Ydot.gifb/fXb.{r.
                                   65   00   66   00   15  5F  28   75  7B 7C 8B  57   01  FF B0  73     //  e.f.._(u{|.Wdot.gifs
                                   28   57   63  6B 1A  90  C7 8F  70   00   72   00  6F  00   70   00     //  (Wckdot.gif.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的简单理解!

完!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值