У меня есть решение, которое вы не можете считать ужасно «чистым», но которое будет работать.Проблема в том, что использование директив препроцессора enum или #define отбросит символическое имя, которое вы используете для константы (например, ERR_OUT_OF_MEMORY на самом деле будет просто целым числом).
В коде C ++ вы можете определитьфункция, которая принимает строковое имя символа и возвращает его значение.Вы можете использовать std :: map, а затем добавить пары, такие как std :: pair ("ERR_OUT_OF_MEMORY", ERR_OUT_OF_MEMORY). Затем вы можете вызвать эту функцию из DLL с помощью DllImportAttribute, который позволяет неуправляемое взаимодействие в .NET.К сожалению, для этого требуется пройти через константы и вывести строку, но преимущество состоит в том, что если эти константы изменятся, то это будет автоматически.
Другое решение - написать простой скрипт, который проходит через препроцессор #defines и создаетгигантский класс .NET с кучей статических констант с тем же именем.На самом деле это не так сложно, учитывая простоту препроцессора (нужно всего несколько строк Perl)