C ++ CLI使用#pragma managed / unmanaged的正确方法

时间:2013-08-03 20:54:54

标签: c++-cli

我正在编写C ++ / CLI应用程序,但我希望我的C ++ DLL中的大部分代码都能本机运行(即不管理)。

我在模块中只有一个CLI类,其他文件都是原生C ++。

那么,确保运行这些本机类的最佳方法是什么......嗯,本机?

我应该:

  • A)将#pragma unmanaged添加到每个本地类的顶部
  • B)只需在我的单个CLI类
  • 中的包含之前添加#pragma unmanaged
  • C)还有别的吗?

由于

3 个答案:

答案 0 :(得分:14)

我这样做的常用方法是将本机代码放入没有.NET支持的静态库项目中(不使用/clr编译)。您可以为C ++ / CLI项目中的单个文件关闭/clr,但之后预编译的标题会变得非常混乱。使用单独的库项目,可以轻松获得本机代码的本机pch和托管代码的托管pch。

然后,我将C ++ / CLI代码与本机C ++ .lib链接以创建DLL。您所做的只是设置项目依赖项,Visual Studio负责其余的工作。

如果您必须在同一个编译单元中组合本机代码和托管代码,也可以使用#pragma managed(push, off)#pragma managed(pop)。但通常头文件中的任何代码都存在,因为您打算将其内联...这意味着当它包含在托管CU中时应该处于托管模式,因此可以将其内联到托管函数中。


尽管他的评论恶意这个答案,Hans has begun recommending my approach

答案 1 :(得分:14)

你不必跳过篮球来确保这一点。编译器只有在打开/ clr选项编译程序时才会发出IL。它看起来像项目选项,但它不是。

只需选择包含本机代码的.cpp文件即可。通过按住Ctrl键并单击资源管理器窗口中的文件,选择多个选项。右键单击+属性,C / C ++,常规。将“公共语言运行时支持”设置更改为“否...”。

答案 2 :(得分:0)

#pragma managed(push, off)#pragma managed(pop) 将非托管代码的 #includes 括起来。

不适用于托管代码。

示例:

#include "MyManagedClass.h"

#pragma managed(push, off)
#include <string>
#include <vector>
#pragma managed(pop)