【问题标题】:How to marshal a C++ enum in C#如何在 C# 中编组 C++ 枚举
【发布时间】:2014-04-06 05:40:19
【问题描述】:

我需要在 C++ 和 C# 之间创建一个包装器。我有一个与此非常相似的功能:

virtual SOMEINTERFACE* MethodName(ATTRIBUTE_TYPE attribType = ATTRIBUTE_TYPE::ATTRIB_STANDARD) = 0;

enum 声明如下:

enum class ATTRIBUTE_TYPE { 
    ATTRIB_STANDARD, 
    ATTRIB_LENGTH 
};

如何包装 ATTRIBUTE_TYPE 枚举?

【问题讨论】:

  • ATTRIBUTE_TYPE 的底层类型是什么?
  • 只是一个简单的枚举:枚举类 ATTRIBUTE_TYPE { ATTRIB_STANDARD, ATTRIB_LENGTH };
  • 只要您在 C# 和 C++ 中指定枚举类型(它们是相同的),您应该能够直接在 P/Invoke 中使用枚举。请注意,并非所有共享名称的 C++ 和 C# 类型都是相同的,例如long 在 C# 中是一个 int64,而在 C++ 中它只是一个 int32。
  • @Mgetz “long”类型在 Microsoft C++ 中是 32 位;它遵循大多数其他地方(例如 GCC)的架构大小。

标签: c# c++ pinvoke marshalling


【解决方案1】:

你的 C++ 枚举是这样定义的:

enum class ATTRIBUTE_TYPE { 
    ATTRIB_STANDARD, 
    ATTRIB_LENGTH 
};

默认情况下,enum class 类型的大小为 int。这意味着您可以像这样将其翻译成 C#:

enum ATTRIBUTE_TYPE { 
    ATTRIB_STANDARD, 
    ATTRIB_LENGTH 
};

仅此而已。 C# 枚举是 blittable 并且此 C# 枚举完全映射到您的 C++ 枚举。

【讨论】:

  • 感谢您为我澄清这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多