C++ cli 正确使用语法管理/非托管的C++ CLI方法 我正在编写一个C++/CLI应用程序,但是我希望C++中的大部分代码都在本地运行,即不被管理。 我在模块中只有一个CLI类,其他文件都是原生C++。

C++ cli 正确使用语法管理/非托管的C++ CLI方法 我正在编写一个C++/CLI应用程序,但是我希望C++中的大部分代码都在本地运行,即不被管理。 我在模块中只有一个CLI类,其他文件都是原生C++。,c++-cli,C++ Cli,那么,确保运行这些本机类的最佳方法是什么。。。嗯,天生的 我应该: 将pragma非托管添加到每个本机类的顶部 B只需在单个CLI类中的includes之前添加pragma unmanaged C还有别的吗? 谢谢我这样做的通常方法是将本机代码放入一个静态库项目中,而不使用.NET支持编译而不使用/clr。您可以为C++/CLI项目中的单个文件关闭/clr,但预编译头会变得非常混乱。使用单独的库项目,可以很容易地为本机代码设置本机pch,为托管代码设置托管pch >我将C++和CLI代码与原生

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

我应该:

将pragma非托管添加到每个本机类的顶部 B只需在单个CLI类中的includes之前添加pragma unmanaged C还有别的吗?
谢谢

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

<> >我将C++和CLI代码与原生的C++ +LIB链接起来创建DLL。您所要做的就是设置一个项目依赖项,VisualStudio会处理其余的工作

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


尽管他的评论中伤了这个答案,.

你不必为了确保这一点而跳出障碍。编译器只有在打开/clr选项编译程序时才会发出IL。它看起来像一个项目选项,但实际上不是


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

包含带有pragma managedpush、off和pragma managedpop的非托管代码

不适用于托管代码

例如:

#include "MyManagedClass.h"

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

@汉斯:从你的评论来看,我只能假设你实际上没有采取你在回答中建议的方法。你没有完全阅读我的答案,因为我也给出了解决方案,并指出了预编译头文件所带来的问题。我也首先尝试了Hans的方法,但后来遇到了PCH问题-我现在已经将本机内容拆分为一个静态库,它工作得很好。还有,imho,lots cleaner,因为没有特定于文件的设置,只有项目范围的设置。在我的例子中,pragma tip起了作用。无法避免包含非托管头文件。对我来说,用pragma push/pop包装这个包含是一个快速而干净的解决方案。如果你打算对此给出一步一步的说明,你最好包括关闭这些CU的预编译头文件的使用。因为pch将使用内部托管代码创建,如果在没有/clr的情况下运行并看到该pch,编译器将中止。这种方法最简单,但@BenVoigt是正确的。为了编译,我不得不将预编译头的用法改为/Yc而不是/Yu。不过,我还没有看到ildasm的结果。