19

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

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

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

我是不是该:

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

谢谢

4

3 回答 3

21

我这样做的常用方法是将本机代码放入不支持 .NET 的静态库项目中(编译时不支持 .NET /clr)。您可以关闭/clrC++/CLI 项目中的单个文件,但随后预编译的头文件会变得非常混乱。使用单独的库项目,很容易为本地代码创建一个本地 pch,为托管代码创建一个托管 pch。

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

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


尽管他的评论诋毁了这个答案,但汉斯已经开始推荐我的方法

于 2013-08-03T21:43:47.083 回答
18

您不必为了确保这一点而费尽心思。编译器仅在打开 /clr 选项编译您的程序时才会发出 IL。它看起来像一个项目选项,但它不是。

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

于 2013-08-03T22:22:29.300 回答
1

#pragma managed(push, off)用和包围非托管代码的#includes #pragma managed(pop)

不适用于托管代码。

例子:

#include "MyManagedClass.h"

#pragma managed(push, off)
#include <string>
#include <vector>
#pragma managed(pop)
于 2021-03-12T15:01:12.230 回答