Visual c++ 有没有办法检测C+中的“pragma unmanaged”是否有效+/CLI? 我有一个项目,其中包括一些性能敏感的本地C++头,大量使用模板。对于这个项目,我们还包装了标题并添加了一些粘合代码,以将功能公开给c#和其他.NET语言。我们将此标题称为“layout.h”,并假设它是第三方标题,我无法更改

Visual c++ 有没有办法检测C+中的“pragma unmanaged”是否有效+/CLI? 我有一个项目,其中包括一些性能敏感的本地C++头,大量使用模板。对于这个项目,我们还包装了标题并添加了一些粘合代码,以将功能公开给c#和其他.NET语言。我们将此标题称为“layout.h”,并假设它是第三方标题,我无法更改,visual-c++,c++-cli,Visual C++,C++ Cli,在混合模式C++/CLI程序集中,相对容易出错,并且“从代码中的某个位置包含”,其中“pragma非托管”(或“pramga托管”(push,off))。当这种情况发生时,模板会生成IL,我在运行代码时会得到额外的托管/非托管转换,性能也会下降 我的问题是,是否有一种方法可以在#include之前进行编译时检查,以便在我意外地#从错误的上下文中包括时编译失败 // File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr

在混合模式C++/CLI程序集中,相对容易出错,并且“从代码中的某个位置包含”,其中“pragma非托管”(或“pramga托管”(push,off))。当这种情况发生时,模板会生成IL,我在运行代码时会得到额外的托管/非托管转换,性能也会下降

我的问题是,是否有一种方法可以在#include之前进行编译时检查,以便在我意外地#从错误的上下文中包括时编译失败

// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
    ASSERT_UNMANAGED()
    #include <layout.h>
//File1.cpp,使用/clr在混合模式C++/CLI程序集中编译
ASSERT_UNMANAGED()
#包括

我天真的第一次尝试检查了#ifdef#MANAGED,但无论我是否在一个#pragma非托管代码块中,这总是被定义的

您可以编写
ASSERT\u MANAGED
ASSERT\u UNMANAGED
代码,这些代码将使用仅在编译托管或非托管时可用的构造。
ref类
声明是一个仅在使用托管时可用的示例


这是一个有点脏的解决方案,但它会起作用。

pragma指令必须直接插入include文件中。这样,在包含文件的任何地方都会声明一个非托管节


很抱歉,您必须修改include文件。

这里有一个可能的解决方案,它利用了intrinsic始终编译为本机(非托管)代码的事实:

#包括
#定义ASSERT_UNMANAGED()\
int TestFunc(void){\
__pragma(警告(推送))\
__pragma(警告(错误:4793))\
auto aumt=[](){return\u bextr\u u64(65537,0,8);}\
__布拉格语(警告(pop))\
返回int(aumt());}
#pragma unmanaged//注释掉这一行,断言失败!
ASSERT_UNMANAGED()
#布拉格管理

编辑:当然,如果您只是想要警告,而不是编译失败,那么可以删除3行
\u pragma(warning())
行。

因此,在编写ASSERT\u MANAGED()时引用类声明-do-work。诀窍是找到合法的C++,而不是合法的C++ +CLI,以使另一个最接近的竞争者使用常数串连接来编写AsjtTununMead()块,如果它工作的话,它是CLI代码(System::String),否则它是本地代码。我仍在进一步探究它!我想到了void uu fastcall foo();实际上不起作用,有一点编译器错误。您是否找到ASSERT_UNMANAGED()的有效实现?我发现需要类似的东西……这真的很难。我可以想出十几种不同的方法来实现
ASSERT\u MANAGED
,但是
ASSERT\u UNMANAGED
让我很为难。万一有人要查找什么,_MANAGED,u CLR\u VER和u cplusplus\u cli不受#pragma MANAGED/#pragma ummanaged影响,这些范围就是整个编译单元。
#include <intrin.h>

#define ASSERT_UNMANAGED() \
int TestFunc(void) { \
    __pragma(warning(push)) \
    __pragma(warning(error:4793)) \
    auto aumt = [] () { return _bextr_u64(65537, 0, 8); }; \
    __pragma(warning(pop)) \
    return int(aumt()); }

#pragma unmanaged   // Comment out this line and the assertion fails!
ASSERT_UNMANAGED()
#pragma managed