Методы синхронизации соответствующих собственных и управляемых перечислений - PullRequest
4 голосов
/ 04 февраля 2011

У меня есть менеджер-оболочка для нативной библиотеки - нативная библиотека - C ++ с экспортированным интерфейсом C, и я использую P / Invoke на управляемой стороне для достижения взаимодействия. Я контролирую как управляемый, так и собственный код.

В нативном коде есть перечисление с соответствующим перечислением в управляемом коде, что-то вроде этого:

// C#
public enum ErrorCode {
  None = 0,
  General = 1,
  BadThings = 2,
  HardDriveWasRemoved = 3,
}

// C++
enum ERROR_CODE {
  ERROR_CODE_NONE = 0,
  ERROR_CODE_GENERAL = 1,
  ERROR_CODE_BAD_THINGS = 2,
  ERROR_CODE_HARD_DRIVE_REMOVED = 3,
}

Эти перечисления должны быть синхронизированы, потому что значения перечисления передаются назад и вперед между управляемым и собственным кодом; неправильное сопоставление между ними вызывает тонкие сбои, которые не всегда сразу очевидны.

Есть ли у кого-нибудь какие-нибудь умные (но относительно легкие) методы для (а) автоматического поддержания этих перечислений в синхронизации или (б) предоставления предупреждения / ошибки / сбоя как можно раньше, чтобы перечисления не были синхронизированы ?

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Поместите их в отдельный файл C #, #include со стороны C ++.# определить все пух C # (как начальный public).Как это:

#define public
#include "enums.cs"
#undef public
2 голосов
/ 04 февраля 2011

Напоминает мне музыкальную шутку: как заставить двух игроков в пикколо играть в такт?A: Shoot one.

Не могли бы вы просто зарегистрировать нативную DLL для COM, затем сослаться и использовать перечисление C ++ в коде C #?Я понимаю, что соглашения об именах немного недопустимы, но в целом наличие одного перечисления кажется самым простым способом достижения того, чего вы хотите.

...