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

Xen*_*ate 11 c++-cli

我正在编写一个C++/CLI应用程序,但我希望我的C++ DLL中的大多数代码都是本机运行的(即不管理).

我在模块中只有一个CLI类,其他文件都是本机C++.

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

我是不是该:

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

谢谢

Ben*_*igt 15

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

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

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


尽管他的评论恶化了这个答案,汉斯已经开始推荐我的方法了.

  • @Hans:从您的评论中我只能假设您没有采用您答案中建议的方法.并且您没有完全阅读我的答案,因为我也提供了该解决方案,并指出了它由预编译头文件引起的问题. (9认同)
  • `#pragma` 提示在我的情况下起到了作用。包含非托管头文件是不可避免的。用`#pragma push/pop` 包装这个包含对我来说是一个快速而干净的解决方案。 (2认同)

Han*_*ant 14

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

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

  • 如果您要为此提供分步说明,最好还包括关闭对这些 CU 使用预编译头文件的功能。因为 pch 将在内部使用托管代码创建,如果在没有 `/clr` 的情况下运行并看到该 pch,编译器将中止。 (2认同)