Даже если вы включите перечисление C # в ваш родной C ++ (как предложено в вашей первой ссылке ), оба перечисления не являются «одинаковыми», перечисление C ++ - это не что иное, как список именованных целых чисел,в то время как перечисление C # является производным от Enum.Как следствие, вы получаете столкновение в C ++ / CLI при попытке использовать их оба.
Возможное решение - использовать препроцессор, чтобы ваша сборка C ++ / CLI видела оба перечисления в разных пространствах имен:
// shared_enum.h
#undef ENUMKEYWORD
#undef ENUMNAMESPACE
#ifdef MANAGED
#define ENUMKEYWORD public enum class
#define ENUMNAMESPACE EnumShareManaged
#else
#define ENUMKEYWORD enum
#define ENUMNAMESPACE EnumShare
#endif
namespace ENUMNAMESPACE
{
ENUMKEYWORD MyEnum
{
a = 1,
b = 2,
c = 3,
};
}
В вашем коде C ++ / CLI сделайте такое включение:
#undef MANAGED
#include "shared_enum.h"
#define MANAGED
#include "shared_enum.h"
Это дает вам возможность различать эти два типа перечислений EnumShare::MyEnum
или EnumShareManaged::MyEnum
в вашем коде C ++ / CLI.
РЕДАКТИРОВАТЬ: только что найдено этоТак что пост , показывающий правильный способ приведения между неуправляемыми и управляемыми перечислениями, наверняка сработает и здесь.Например, в C ++ / CLI переход от управляемого к неуправляемому перечислению может быть сделан следующим образом:
void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
{
EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
// call a native function "func"
func(nx);
}