c# - 共享来自 C#、C++/CLI 和 C++ 的枚举

标签 c# .net c++ enums c++-cli

我有一个由三部分组成的库。首先是提供实际功能的 native C++。其次是 C++ 库的 C++/CLI 包装器/适配器,以简化 C# 到 C++ 的转换。最后我有一个 C# 库,它通过 C++/CLI 适配器调用 C++ 库。

现在我有两组并行枚举定义,一组存储在 .cs 文件中,另一组存储在 .h 文件中。这带来了双重问题:

  1. 我有双重维护。我必须始终在两个文件位置同步枚举的更改。
  2. 两个枚举使用的命名空间应该相同,但 C++/CLI 包装器会查看两组枚举并在它们之间进行转换,这会导致命名冲突。

现在我不确定诸如 this 之类的解决方案 that 将解决两个问题。想法?

最佳答案

即使您在 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::MyEnumEnumShareManaged::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/

相关文章:

c# - 如何在 XML 文档的特定位置添加 XElement

c# - DevExpress:如何更改 SearchLookUpEdit 控件的背景颜色

c++ - 最小化无边界对话框问题

c++ - 为什么 C++ 标准库不包含哈希表实现?

c# 将锯齿状数组复制到字符串

c# - 显示多个表单

c# - MVC 4 样式捆绑 - 如何添加浏览器特定的样式表

.net - PaintEventArgs.ClipRectangle 和 PaintEventArgs.Graphics.ClipBounds 有什么区别

.net - 合并 .NET Standard 程序集

c++ - 设置 PATH 变量不起作用