2、用托管C++可以开发.NET框架的项目类型
使用托管C++应该是C++程序员编写.NET框架应用
程序最好的一种选择,通过集成在Visual Studio.NET开发环境的托管C++向导,我们可以创建以下几种开发.NET框架的项目类型:
(1) 托管C++
应用程序:用来创建一个支持托管扩展的单独C++应用程序,使用它还可创建任何类型的应用程序,包括.NET框架客户应用程序。
(2) 托管C++类库:用来创建一个支持托管扩展的C++DLL,使用它可以生成一个能被.NET框架应用程序调用的托管类型的组件。
(3) 托管C++空项目:用来创建一个空的托管项目,该项目只含有支持托管扩展的正确编译和链接的开关选项。使用它能将一个已有的C++源文件进入到一个托管环境中。
(4) 托管C++ Web服务:用于创建两个项目,一个是C++托管扩展项目,另一个是部署项目。
3、托管C++与标准C++的主要区别 尽管托管C++是从标准C++建立而来的,但它与标准C++有着本质上的区别,这主要体现在以下几个方面:
(1) 广泛采用“名称空间”(namespace) 名称空间是类型的一种逻辑命名方案,.NET使用该命名方案用于将类型按相关功能的逻辑类别进行分组,利用名称空间可以使开发人员更容易在代码中浏览和引用类型。当然,我们也可将名称空间理解成是一个“类库名”。
尽管很早Microsoft就在Visual C++中支持名称空间的
编程方式,但是很少引起Visual C++程序员的普遍关注。现在在托管C++程序中,我们必须使用这一方式,即使用#using和using关键字。例如下面的简单程序代码是在
控制台上输出“Hello World”:
#using using namespace System; int main(void) { Console::WriteLine(S"Hello World"); return 0; } |
代码中,#using是用来将一个元数据文件输入到托管C++程序中,这些文件可以是包含托管数据和结构的MSIL (Microsoft intermediate language,微软中间语言)文件,如DLL、EXE、OBJ文件等。mscorlib.dll是.NET框架的一个核心类库,包含主要的名称空间System。程序的第二行代码“using namespace System;”用来使用System名称空间。System是.NET框架根名称空间,包含最基本的类型,如用于数据流的输入/输出的System::IO等。
在对托管C++程序开发的不断深入,我们不久就会发现,许多类型的引用都要在程序的前面使用#using和using来进行。
(2) 基本数据类型的变化 我们知道,标准C++语言的数据类型是非常丰富的。而托管C++的数据类型更加丰富,不仅包含了标准C++中的数据类型,而且新增了__int64(64位整型)、Decimal(96位十进制数)、String*(字符串类型)和Object*(对象类型)等类型,表1-1列出它们各自数据类型。
类型描述 |
标准C++类型名 |
托管C++类型名 |
长度(位) |
布尔型 |
bool |
bool |
8 |
字符型 |
char |
signed char |
8 |
无符号字符型 |
unsigned char |
char |
8 |
短整型 |
short [int] |
short |
16 |
无符号短整型 |
unsigned short [int] |
unsigned short |
16 |
整型 |
int |
int 或 long |
32 |
无符号整型 |
unsigned [int] |
unsigned int 或 long |
32 |
长整型 |
long [int] |
long |
32 |
无符号长整型 |
unsigned long [int] |
unsigned long |
32 |
单精度浮点型 |
float |
float |
32 |
双精度浮点型 |
double |
double |
64 |
长双精度浮点型 |
long double |
-- |
64 |
Unicode字符 |
-- |
wchar_t |
16 |
64位整型 |
-- |
__int64 |
64 |
无符号64位整型 |
-- |
unsigned __int64 |
64 |
96位十进制值 |
-- |
Decimal |
96 |
对象类型 |
-- |
Object* |
32 |
字符串类型 |
-- |
String* |
-- |
需要注意的是,String和Object在定义一个变量时,注意要有星号(“*”),但这个变量不是指针变量,这与标准C++的含义是不一样的。例如上面的代码可以改为:
#using using namespace System; int main(void) { String* hello = S"Hello World"; Console::WriteLine(hello); return 0; } |