回 帖 发 新 帖 刷新版面

主题:关于.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应用程序里面去,好像是编译不过去的,该怎么办呢?

独自摸索,路漫漫,请高手指点!

回复列表 (共6个回复)

沙发

没人理我,只好自己给自己作答了。

找到了一片相关的文章,很不错的。讲述了该如何让托管代码和非托管代码在MFC应用程序里并存的方法。

有兴趣的兄弟可以看看。

http://www.vckbase.com/document/viewdoc/?id=1360

板凳

几个有用的设置:

在MFC里面调用托管资源,可以这样进行设置:

在项目属性里,选择“配置属性”->“常规”,把里面的“公公语言运行库支持”,设置成:“公共语言运行库支持(/clr)”。这是一个全局变量,这样设置以后,所有的代码的编译都会因此而受影响(连非托管代码可能也会因之而受影响,具体是什么影响,我暂时还不知道,可能是语法检查没有那么严格了吧。)

所以还有另外一种设置方法:

把上面所提到的“公共语言运行库支持”设置成“无公共语言运行库支持”,然后,到“C/C++”里面的“命令行”里添加“/clr”开关,但是光这样还不行,如果这样进行编译的话,系统会告诉你,有一个开关和你添加的这个“/clr”冲突,所以有必要把这个开关关掉。这个开关在哪里呢?嗬嗬……其实如果再按照地一种方法进行设置的时候稍加留意,就会发现,用第一种方法设置了以后,“C/C++”选项下的“代码生成”下的“启用C++异常”选项会被自动由原来的“是(/EHsc)”改成:“是,但有 SEH 异常(/EHa)”,这里的/EHs就是系统所提到的和我们自行添加的“/clr”开关所冲突的那个开关,那么好了,只要在这里进行手动设置,把“是(/EHsc)”改成:“是,但有 SEH 异常(/EHa)”,编译……嗬嗬……

目前只研究到了这个阶段,至于到底行不行的通,会不会有不好的影响,我还不得而知。

让我们共同努力吧。

3 楼

还有一种设置方法:

不对全局的(也就是项目的)属性进行设置,只对需要调用.net框架资源的.cpp进行设置。

右键点击该cpp,选择属性,选择命令行,添加"/clr"。编译之,得错误提示:/EHs和/clr不兼容。老办法,到该cpp的代码生成里,把C++异常改成:是,但是有SEH异常(/EHa),再编译,提示预处理头不一致,再到属性里想办法,把预处理头里面的“创建/是用预处理头”关掉。

呵呵……通过了。

4 楼

谢谢!跟你学到点东西。

5 楼

强……

6 楼

CLR控制的代码就是托管代码

我来回复

您尚未登录,请登录后再回复。点此登录或注册