主题:关于.net的几个不明白,概念性的,请指教!
看了很多.net的资料,大概明白了一点东西,就是.net里面的代码,可以分为托管和非托管两类。
那么,到底什么样的代码是托管的?什么样的是非托管的?简单的说,我们从日常编程的步骤上来讲,我应该怎样动手,才能进入写托管代码的环境,怎样动手,进入的是写非托管代码的环境?
是不是在IDE里面,点击文件->新建->项目->Visula C++ -> Windows窗体应用程序,就是可以用托管代码来写程序,而如果从Visual C++ ->MFC 应用程序,创建的项目,就只能用非托管代码?那么如果是这样,除了这两项之外,还有其他的很多个类型的项目,比如:SQL Server项目、CLR空项目、ALT Web Server服务项目等等,它们又应该用什么样的代码来进行编程呢?
我之所以举Windows窗体应用程序和MFC应用程序这两个例子,是因为这两个应用程序的项目我都已经尝试过了。下面讲讲我的心得体会:
Windows窗体应用程序,一开始,系统就已经按照托管的样子,写了许多using namespace system;之类的语句在里面了,想当然的,应该就是托管代码了,在那里面编程序,如果要用到字符串,都是拿String^来进行声明(虽然到现在为止我还没有完全搞清楚这里的^符号到底是什么意思,但是好像在这里,用^声明的变量通用性极强,如果不加上这玩意儿,你就等着吧),而且这里的变量类型都有一个长长的前缀,比如:声明函数类型为空的话,需要用:System::Void来进行声明。(当然,直接用void也是可以的,但是不知道为什么,系统自动给你见的几个函数,都是拿这样的形式来进行声明的,看上去很复杂,我目前还不知道这样有什么好处),另外,在这里所用到的窗体,就是所谓的Form,竟然只有一个Form.h和Form.resX,而没有cpp文件。所有的函数全部都在Form.h里面声明并且编辑函数体,至于那个.resX,我看来应该是用来描述窗体的形状和控件的。
MFC应用程序,网上很多资料都说,这是非托管代码。也的确,新建了一个MFC的应用程序之后,出现的初始模样的确和VC6.0得比较接近。用习惯了VC6.0的应该很容易上手。这里面的窗体还是保留了.h和.cpp两个文件的结构,而且CString还是很频繁的出现在函数参数中。但是有一点很让人头疼,就是到了.net 2005里面,好像对数据类型的匹配看得比天还大。信不信由你,char mychar[10]所声明的数组,它的数组名不能够拿来当作指针传递给char*类型的参数。至于CString类型的变量和LPCTSTR类型的参数更是如此。这些在以前的VC6.0里面可都是允许的。
我最大的一个疑问就是:如果我在MFC应用程序里,想使用托管的类,比如:Regex,在MSDN里面有例子,在使用Regex之前,要先
#using <system.dll>
using namespace System;
using namespace System::Text::RegularExpressions;
然而如果我直接把这些代码复制到我的MFC应用程序里面去,好像是编译不过去的,该怎么办呢?
独自摸索,路漫漫,请高手指点!
那么,到底什么样的代码是托管的?什么样的是非托管的?简单的说,我们从日常编程的步骤上来讲,我应该怎样动手,才能进入写托管代码的环境,怎样动手,进入的是写非托管代码的环境?
是不是在IDE里面,点击文件->新建->项目->Visula C++ -> Windows窗体应用程序,就是可以用托管代码来写程序,而如果从Visual C++ ->MFC 应用程序,创建的项目,就只能用非托管代码?那么如果是这样,除了这两项之外,还有其他的很多个类型的项目,比如:SQL Server项目、CLR空项目、ALT Web Server服务项目等等,它们又应该用什么样的代码来进行编程呢?
我之所以举Windows窗体应用程序和MFC应用程序这两个例子,是因为这两个应用程序的项目我都已经尝试过了。下面讲讲我的心得体会:
Windows窗体应用程序,一开始,系统就已经按照托管的样子,写了许多using namespace system;之类的语句在里面了,想当然的,应该就是托管代码了,在那里面编程序,如果要用到字符串,都是拿String^来进行声明(虽然到现在为止我还没有完全搞清楚这里的^符号到底是什么意思,但是好像在这里,用^声明的变量通用性极强,如果不加上这玩意儿,你就等着吧),而且这里的变量类型都有一个长长的前缀,比如:声明函数类型为空的话,需要用:System::Void来进行声明。(当然,直接用void也是可以的,但是不知道为什么,系统自动给你见的几个函数,都是拿这样的形式来进行声明的,看上去很复杂,我目前还不知道这样有什么好处),另外,在这里所用到的窗体,就是所谓的Form,竟然只有一个Form.h和Form.resX,而没有cpp文件。所有的函数全部都在Form.h里面声明并且编辑函数体,至于那个.resX,我看来应该是用来描述窗体的形状和控件的。
MFC应用程序,网上很多资料都说,这是非托管代码。也的确,新建了一个MFC的应用程序之后,出现的初始模样的确和VC6.0得比较接近。用习惯了VC6.0的应该很容易上手。这里面的窗体还是保留了.h和.cpp两个文件的结构,而且CString还是很频繁的出现在函数参数中。但是有一点很让人头疼,就是到了.net 2005里面,好像对数据类型的匹配看得比天还大。信不信由你,char mychar[10]所声明的数组,它的数组名不能够拿来当作指针传递给char*类型的参数。至于CString类型的变量和LPCTSTR类型的参数更是如此。这些在以前的VC6.0里面可都是允许的。
我最大的一个疑问就是:如果我在MFC应用程序里,想使用托管的类,比如:Regex,在MSDN里面有例子,在使用Regex之前,要先
#using <system.dll>
using namespace System;
using namespace System::Text::RegularExpressions;
然而如果我直接把这些代码复制到我的MFC应用程序里面去,好像是编译不过去的,该怎么办呢?
独自摸索,路漫漫,请高手指点!