有没有办法检测#pragma unmanaged是否在C++/CLI中生效?

Dav*_*ore 12 c++-cli visual-c++

我有一个项目,其中包括一些性能敏感的本机C++标头,大量使用模板.对于这个项目,我们还包装头文件并添加一些粘合代码以向c#和其他.NET语言公开功能.我们将此标题称为"layout.h",我们将假设它是第三方标题,我无法更改.

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

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

// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
    ASSERT_UNMANAGED()
    #include <layout.h>
Run Code Online (Sandbox Code Playgroud)

我天真的第一次尝试检查了#ifdef _MANAGED,但总是定义我是否在#pragma非托管代码块中.

Aja*_*jay 0

您可以编写ASSERT_MANAGEDASSERT_UNMANAGED编码使用仅在编译托管或非托管时可用的构造。声明ref class是一个仅在使用托管时可用的示例。

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

  • 另一个最接近的竞争对手是使用常量字符串连接,如果它有效,它是 CLI 代码 (System::String),否则它是本机代码。我还在进一步探索! (2认同)