У меня есть заголовочный файл в управляемом проекте DLL как так:
Enums.h:
#pragma once
...
public ref struct ManagedStruct {
Bitmap^ image;
}
...
На этот заголовок ссылаются и от другого класса в DLL и от отдельного исполняемого файла. Одна только управляемая структура генерирует:
ошибка C2011: 'ManagedStruct': переопределение типа 'класса'.
Если я перемещаю структуру в основной заголовочный файл в DLL, это хорошо работает и публично доступно, таким образом, это - то, что я делаю, но я очень хотел бы изучить, почему это происходит, когда я просто перемещаю его в другой файл.
Я проверил, что все необходимые включают и пространства имен И попробовали очевидную защиту заголовка, напрасно; я все еще получаю ошибку.
Большое спасибо за любое понимание!
При работе с управляемым кодом вам придется немного перенастроить традиционное мышление заголовочных файлов C/C++. Основным источником объявлений типов являются метаданные сборки. Это очень отличается от модели компиляции родного C/C++, где вы должны иметь заголовочный файл для типов, которые вы делаете видимыми для других модулей.
Я собираюсь предположить, что вы получаете эту ошибку C2011 в проекте EXE. Где вы и добавили ссылку на сборку проекта DLL (как и положено) и использовали #include в заголовочном файле. Как и не следовало. Это гарантированное дублирующее определение, #pragma once не исправляет это.
Не используйте заголовочные файлы для определений экспортируемых типов. Всегда используйте ссылки на сборку.