您的位置:首页 > 编程语言 > C语言/C++

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

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

1)NativeClass

C++/CLI代码:




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的定义:



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



2)ValueStruct

ValueStruct的定义:




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)



3)RefClass

RefClass的定义:




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)



4)main函数

main函数代码:




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的函数头(可以看到被编译为全局的静态函数):



具体的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}Y

b/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}Y

b/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}Y

b/fXb.{r.
65 00 66 00 15 5F 28 75 7B 7C 8B 57 01 FF B0 73 // e.f.._(u{|.W

s
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的简单理解!

完!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: