У меня есть базовая c C ++ / CLI DLL в VS 2017, которая определяет класс оболочки, описанный ниже. Свойства проекта настроены на создание среды CLR с. NET 4.6.1 в качестве цели.
#include "ApiManagerWrapper.h" // very basic CLI wrapper header
#include "Handler.h" // This header is an API example that includes windows.h
using namespace System;
using namespace std;
namespace CLI
{
ApiManager::ApiManager()
: ManagedObject(new GXP_API::ApiManager())
{
Console::WriteLine("Creating a new ApiManager-wrapper object!");
}
}
Мне нужно повторно использовать файл C ++ (handler.h, вне пакета разработчика API), который включает сам windows .h, в основном для использования структур HANDLE и CRITICAL_SECTION. Я знаю это, потому что, если я удалю windows .h include из заголовка handler.h (и значительную часть кода, использующего вышеупомянутые структуры), DLL-оболочка CLI компилируется нормально.
Проблема в том, что FILETIME определен как в одном из заголовков, включенных в windows .h (minwinbase.h), так и в пространстве имен System :: Runtime :: InteropServices. В VS 2017 об ошибке сообщается как E0266 со ссылкой на поток, который рекомендует квалифицировать использование FILETIME с предполагаемой областью использования (:: FILETIME). Однако в данном случае это невозможно, так как этот заголовок взят из ОС. Мне также нужно использовать пространство имен System, поскольку оно является основой механизма сборки CLI.
Как можно разрешить этот конфликт? Есть ли способ не использовать данную часть пространства имен System? Есть ли способ указать компилятору, как разрешить конфликт?