Используйте константы C ++ в программе C # - PullRequest
4 голосов
/ 22 июля 2010

У нас есть ситуация, когда мы используем набор сторонних неуправляемых библиотек C ++ в нашем приложении C # (WPF), но мы также используем подмножество их библиотек включения для создания наших собственных неуправляемых библиотек, которые будут использоваться в нашем приложении.

Эти библиотеки создают метаданные, которые хранятся в базе данных.Однако мы должны реплицировать некоторые константы, связанные с этими метаданными, в наш код C #, чтобы использовать метаданные.

Существует потенциальная проблема, если некоторые из этих констант изменяются между версиями.Есть ли чистый способ для приложения C # использовать константы, определенные в включаемых файлах C ++?

Спасибо, wTs

Ответы [ 2 ]

3 голосов
/ 22 июля 2010

У меня есть решение, которое вы не можете считать ужасно «чистым», но которое будет работать.Проблема в том, что использование директив препроцессора 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)

3 голосов
/ 22 июля 2010

Вам нужно будет переопределить их внутри C #, в ваших классах-оболочках C #.

К сожалению, если константы изменятся, вам также потребуется изменить свою копию. (Однако изменение значений констант между версиями - очень плохая идея, поэтому, надеюсь, сторонний API не сделает этого с вами ...)


Как говорится, для этого есть варианты. Вы можете, например, создать небольшую программу на C ++, которая использует API и записывает все константы в файл .cs в правильном формате. Это защитит вас, если константы изменятся между версиями (по крайней мере, если значения изменятся), но вам все равно нужно будет обновить вашу программу для обработки дополнительных констант в будущих версиях, если потребуется.

Другой вариант - использовать C ++ / CLI для предоставления констант непосредственно внутри класса и ссылаться на эту сборку и класс из C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...