WEB开发网
开发学院软件开发VC 如何从 MFC 应用程序中调用 .NET 框架 阅读

如何从 MFC 应用程序中调用 .NET 框架

 2006-07-20 11:41:42 来源:WEB开发网   
核心提示: 对于项目中的每一个 .cpp 文件,“基本运行时检查”设置为“默认”,如何从 MFC 应用程序中调用 .NET 框架(5),这样做十分不幸,因为对于本地/非托管函数来说,只有它是用 /clr 开关编译的,不进行运行时检查,这项检查是很好的事情

对于项目中的每一个 .cpp 文件,“基本运行时检查”设置为“默认”。这样做十分不幸,因为对于本地/非托管函数来说,这项检查是很好的事情。它有助于你在交付前发现程序的Bug。但对于要调用.NET类库的程序来说,这样做就不是一件好事。那么我们该怎么办呢?

问题是使用托管扩展调用 .NET 框架,你必须将“使用托管扩展”设置为“是”,它将打开/clr开关,进行这个设置的唯一地方是在项目属性页中,它是全局有效的。“使用托管扩展”为项目中所有模块打开/clr 开关。在缺省情况下,所有函数都是托管的了。如果你想默认使用本地模式,可以在 stdafx.h 文件的末尾添加一行:

#pragma unmanaged

因为每个模块都要包含 stdafx.h 文件,所以所有模块都是以本地模式进行编译的。当要调用 .NET 框架时,你可以像这样跳到托管模式:

#pragma managed
void DoSomethingWithDotNET(...) {
  // call framework classes here
  // safe from managed functions
}

直到现在,我都是用这个技巧(将 #pragma unmanaged 放在 stdafx.h 末尾)。但它解决不了运行时检查问题,因为 /clr 仍然与 /RTC 不兼容,即便你的大多数函数是本地的。在混合模式的应用程序中,编译器不会让你在本地函数中进行运行时检查的。

Figure 5 项目设置

你真正想做的是只用 /clr 编译调用 .NET 框架的模块。但如何做呢?当在项目范围内使用“使用托管扩展”时,这一点很容易做到:在模块生成属性的“命令行”项下添加专门的开关即可。Figure 5 和 Figure 6 显示了设置方法。在全局项目设置中,将“使用托管扩展”设置为“否”,然后针对每个调用 .NET 框架的模块添加 /clr。此时其它模块仍然使用 /RTC1 并执行运行时检查。当然,你必须将<mscorlib.dll>以及所有来自 stdafx.h 的框架文件移到托管模块中。如果你愿意,可以将所有标准的 .NET 包含在一个 UsesDotNet.h 文件中,就像下面这样:

#using <mscorlib.dll>
#using <System.dll>
#include <vcclr.h>
using namespace System;

Figure 6 模块设置

然后在每个调用 .NET 框架的模块中包含 #include "UsesDotNet.h" 即可。你仍然可以在某个模块中用 #pragma managed/unmanaged 来混合托管和本地代码。

还有一个设置要做,那就是当你添加 /clr 到一个模块文件时,除了关闭运行时检查外,你同时还必须选择“不使用与编译头”。与编译头信息仅在所有模块具有相同的编译选项时才起作用;如果一个模块有 /clr 选项,那么它不能使用与其它没有 /clr 选项的模块相同的预编译头。嘿,当今计算机是如此之快,谁还需要预编译头?如果你确实想与众不同,那么就用单独的头文件如 UsesDotNet.h 来编译你的托管模块吧。

在实际应用中,如果你使用我这里所描述的方法,请参考本文附带的例子代码:Typematic.NET,其中所有模块都是以常规的本地方式编译的,通过 stdafx.h 使用预编译头,并且不使用“托管扩展”选项。唯一调用 .NET 框架的函数位于一个单独的模块文件中:SendString.cpp,只有它是用 /clr 开关编译的,不进行运行时检查,也不使用预编译头。

上一页  1 2 3 4 5 

Tags:如何 MFC 应用程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接