Even if you include the C# enum in your native C++ (as suggested in your first link), both enums are not "the same", the C++ enum is nothing but a list of named integers, while the C# enum is derived from Enum. As a consequence, you get a collision in C++/CLI when trying to use them both.
A possible solution is to use the preprocessor so that your C++/CLI assembly sees both enums in different namespaces:
// 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,
};
}
In your C++/CLI code, make an inclusion like that:
#undef MANAGED
#include "shared_enum.h"
#define MANAGED
#include "shared_enum.h"
This gives you the availability to distinguish between those two kind of enums
EnumShare::MyEnum
or EnumShareManaged::MyEnum
in your C++/CLI code.
EDIT: just found this SO post showing the correct way to cast between unmanaged and managed enums, this surely will work here, too. For example, in the C++/CLI, the transition from managed to unmanaged enum can be done like this:
void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
{
EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
// call a native function "func"
func(nx);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…