我正在编写C ++ / CLI应用程序,但我希望我的C ++ DLL中的大部分代码都能本机运行(即不管理)。
我在模块中只有一个CLI类,其他文件都是原生C ++。
那么,确保运行这些本机类的最佳方法是什么......嗯,本机?
我应该:
由于
答案 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)