Visual C++ 2005(Visual C++ 8.0)中的C++支持C++/CLI,C++/CLI同时支持C++语言特性和.NET编程语言特性,可以实现.NET CLI不支持而C++支持的语言特性,例如多重继承等,还支持混合Assembly,可以在同一Assembly中混合使用CIL代码和本机代码。
C++/CLI的功能要比C#强的多,更适合作为分析.NET Framework内核的编程语言,笔者试编写了一个C++/CLI程序,试图通过反汇编编译生成的.NET Assembly可执行文件,分析C++/CLI中类的本质。
笔者编写的这个程序是一个试验性的复数和实数计算程序,下面是C++主程序(TypesSample1_CPP.cpp):
// TypesSample1_CPP.cpp: 主项目文件。
#include "stdafx.h"
using namespace System;
//Complex 类,.NET CTS值类型。
value class Complex
{
public:
double Re;
double Im;
Complex(double Re,double Im);
};
Complex::Complex(double Re,double Im)
{
this->Re=Re;
this->Im=Im;
}
//ComplexMath 类型,.NET CTS引用类型。
ref class ComplexMath
{
public:
Complex Add(Complex OpNum1,Complex OpNum2);
Complex Minus(Complex OpNum1,Complex OpNum2);
};
Complex ComplexMath::Add(Complex OpNum1,Complex OpNum2)
{
Complex Result1;
Result1.Re=OpNum1.Re+OpNum2.Re;
Result1.Im=OpNum1.Im+OpNum2.Im;
return Result1;
}
Complex ComplexMath::Minus(Complex OpNum1,Complex OpNum2)
{
Complex Result1;
Result1.Re=OpNum1.Re-OpNum2.Re;
Result1.Im=OpNum1.Im-OpNum2.Im;
return Result1;
}
//DisplayComplex类,C++ 类。
class DisplayComplex
{
public:
void Display(Complex C);
};
void DisplayComplex::Display(Complex C)
{
String ^ReStr,^ImStr;
ReStr=C.Re.ToString();
ImStr=C.Im.ToString();
Console::WriteLine(ReStr+"+"+ImStr+"i");
}
//RealMath类,C++ 类,编译成本机代码。
#pragma unmanaged
class RealMath
{
public:
double Add(double OpNum1,double OpNum2);
double Minus(double OpNum1,double OpNum2);
};
double RealMath::Add(double OpNum1,double OpNum2)
{
return OpNum1+OpNum2;
}
double RealMath::Minus(double OpNum1,double OpNum2)
{
return OpNum1-OpNum2;
}
#pragma managed
//主函数
int main(array<System::String ^> ^args)
{
//C++/CLI中,.NET CTS值类型变量直接定义。
Complex C1(2,2),C2(1,1);
Complex C3,C4;
//C++/CLI中,.NET CTS引用类型的对象通常使用