我有一个由三部分组成的库。首先是提供实际功能的 native C++。其次是 C++ 库的 C++/CLI 包装器/适配器,以简化 C# 到 C++ 的转换。最后我有一个 C# 库,它通过 C++/CLI 适配器调用 C++ 库。
现在我有两组并行枚举定义,一组存储在 .cs 文件中,另一组存储在 .h 文件中。这带来了双重问题:
- 我有双重维护。我必须始终在两个文件位置同步枚举的更改。
- 两个枚举使用的命名空间应该相同,但 C++/CLI 包装器会查看两组枚举并在它们之间进行转换,这会导致命名冲突。
最佳答案
即使您在 native C++ 中包含 C# 枚举(如您的 first link 中所建议的那样),两个枚举也不是“相同的”,C++ 枚举不过是命名整数的列表,而 C# 枚举是源自枚举。因此,当您尝试同时使用它们时,您会在 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 代码中。
编辑:刚刚找到 this SO post显示在非托管和托管枚举之间进行转换的正确方法,这肯定也会在这里工作。例如,在 C++/CLI 中,从托管枚举到非托管枚举的转换可以这样完成:
void MyWrapperClass::MyWrapperFunction(EnumShareManaged::MyEnum mx)
{
EnumShare::MyEnum nx = static_cast<EnumShare::MyEnum>(mx);
// call a native function "func"
func(nx);
}
关于c# - 共享来自 C#、C++/CLI 和 C++ 的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240263/