2011-02-04 1 views
4

У меня есть обертка менеджера для собственной библиотеки - родная библиотека - это 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, 
} 

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

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

+2

Связанные вопросы с ответами, но ни выбрали в качестве ответа: http://stackoverflow.com/questions/1947576/shared-common-definitions-across-cc-unmanaged-and-managed-c- код –

+0

А, спасибо, я пропустил это в своем первоначальном поиске из-за отсутствия термина «перечисление» в названии, которое я предполагаю. –

+1

Dupe из найденного Erik, а также http://stackoverflow.com/questions/3457646/using-enum-in-c-and-c-via-c-header и http://stackoverflow.com/questions/ 954321/is-it-possible-to-share-an-enum-declaration-between-c-and-unmanaged-c и http://stackoverflow.com/questions/3240263/sharing-an-enum-from-cc- cli-and-c .. и это были только те, которые были найдены при поиске "[C++] [C#] перечисления" –

ответ

6

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

#define public 
#include "enums.cs" 
#undef public 
+0

Это звучит достаточно умно, чтобы он мог работать! –

+0

Pretty slick - хотя вы все равно несете ответственность за сохранение двух в синхронизации внутри файла, не должно быть слишком большой проблемой. –

+1

Вам действительно нужны два разных соглашения об именах? Я бы сказал, что важность сохранения двух в соглашении о синхронных козырях. Если не уверен, идите с C++. CONSTANTS_ARE_MEANT_TO_BE_LIKE_THIS. AndCamelCaseDenotesManyOtherThingsAlready. –

2

Напоминает мне музыку шутки: Как вы можете играть в двух игроков в стиле piccolo? A: Стреляйте.

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

+0

Было бы говорить, что ... –

+0

@Seva - шутка или ответ? : P – KeithS

+0

ответ. Что я знаю о piccolo ... –