Есть ли способ определить, действует ли #pragma unmanaged в C ++ / CLI?

У меня есть проект, который включает некоторые чувствительные к производительности нативные заголовки C ++, в которых интенсивно используются шаблоны. Для этого проекта мы также обертываем заголовки и добавляем некоторый связующий код, чтобы предоставить функциональность C # и другим языкам .NET. Мы назовем этот заголовок «layout.h» и предположим, что это сторонний заголовок, который я не могу изменить.

В смешанном режиме сборки C ++ / CLI относительно легко сделать ошибку и # включить из места в коде, где #pragma unmanaged (или #pramga managed (push, off)). Когда это происходит, шаблоны генерируют IL, и я получаю дополнительные управляемые / неуправляемые переходы при запуске кода, и производительность падает.

Мой вопрос заключается в том, есть ли способ выполнить проверку во время компиляции непосредственно перед # include, чтобы компиляция завершилась неудачей, если я случайно #including из неправильного контекста.

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

Моя наивная первая попытка проверила #ifdef _MANAGED, но это всегда определяется, нахожусь ли я в неуправляемом блоке кода #pragma или нет.

12
задан Dave Moore 12 August 2011 в 10:58
поделиться