我正在编写一个 C++ / CLI 应用程序,但我希望我的 C++ DLL 中的大部分代码能够本地运行(即不受管理)。
我在模块中只有一个 CLI 类,其他文件都是原生 C++。
那么,确保这些本地类运行的最佳方法是什么……嗯,本地?
我是不是该:
- A)将#pragma unmanaged 添加到每个本地类的顶部
- B)只需在我的单个 CLI 类中的包含之前添加#pragma unmanaged
- C) 别的?
谢谢
我正在编写一个 C++ / CLI 应用程序,但我希望我的 C++ DLL 中的大部分代码能够本地运行(即不受管理)。
我在模块中只有一个 CLI 类,其他文件都是原生 C++。
那么,确保这些本地类运行的最佳方法是什么……嗯,本地?
我是不是该:
谢谢
我这样做的常用方法是将本机代码放入不支持 .NET 的静态库项目中(编译时不支持 .NET /clr
)。您可以关闭/clr
C++/CLI 项目中的单个文件,但随后预编译的头文件会变得非常混乱。使用单独的库项目,很容易为本地代码创建一个本地 pch,为托管代码创建一个托管 pch。
然后我将我的 C++/CLI 代码与本机 C++ .lib 链接以创建 DLL。您所做的只是设置项目依赖项,Visual Studio 会负责其余的工作。
如果您绝对必须在同一个编译单元中组合本机代码和托管代码,#pragma managed(push, off)
您也可以使用。#pragma managed(pop)
但通常头文件中的任何代码都在那里,因为您打算将其内联......这意味着当包含到托管 CU 中时它应该处于托管模式,因此它可以内联到托管函数中。
尽管他的评论诋毁了这个答案,但汉斯已经开始推荐我的方法。
您不必为了确保这一点而费尽心思。编译器仅在打开 /clr 选项编译您的程序时才会发出 IL。它看起来像一个项目选项,但它不是。
只需选择包含本机代码的 .cpp 文件。通过按住 Ctrl 键并单击资源管理器窗口中的文件来选择其中多个。右键单击 + 属性、C/C++、常规。将“公共语言运行时支持”设置更改为“否...”。
#pragma managed(push, off)
用和包围非托管代码的#includes #pragma managed(pop)
。
不适用于托管代码。
例子:
#include "MyManagedClass.h"
#pragma managed(push, off)
#include <string>
#include <vector>
#pragma managed(pop)