【问题标题】:Assign value to C# enum from C++/CLI const从 C++/CLI const 为 C# 枚举赋值
【发布时间】:2016-06-27 07:56:21
【问题描述】:

我已经搜索了与此主题类似的其他答案,但没有找到任何完全相关的内容。我正在尝试使用在 C++/CLI 文件中标记为静态 const 的值在 C# 中为某些枚举分配值,这些值被编译成 DLL 并在 C# 项目中引用。所有这一切都很好,除了它给了我“分配给'XXX'的表达式必须是常数”,如果C++/CLI值不是常数,我会预料到这一点。我的 C++/CLI 代码是从第 3 方供应商提供的文件中自动生成的,因此我用于更改该方面的选项非常有限。

摘录如下:

C++/CLI 文件:

public ref class SEVERE_LEVEL sealed {
  public: 
    static const System::Int32 VALUE = 200;
  private:
    SEVERE_LEVEL() {}
};

还有 C# 文件:

public enum LoggerLevel {
  SevereLevel = SEVERE_LEVEL.VALUE  // This gives the "must be constant" error
}

有几个不同的日志级别,每个级别都在 C++/CLI 文件中自己的单独类中定义。我想在某些方法调用中使用 C# 枚举作为参数类型,以确保仅传入有效值。任何想法如何使这项工作或替代设计的建议?

【问题讨论】:

  • 这是一个非常古怪的代码生成器。我只是尝试插入 public enum class 声明,就像它应该那样。

标签: c# enums c++-cli constants mixed-mode


【解决方案1】:

C++ const 关键字不会映射到 .NET 中的任何内容。

C++/CLI 添加新的上下文相关关键字以匹配 .NET 功能:initonlyliteral

如果您使用literal System::Int32 VALUE = 200;,那么它应该可以工作。让 C# 编译器使用 .NET 元数据中未标记为“文字”的值定义枚举并不神奇。

【讨论】:

  • 感谢您的建议!我将自动生成的类包装在一个新的 C++ 类中,该类包含标记有“literal”关键字集的成员,该关键字集等于以前的静态 const 成员。这使我可以将它们完美地分配给 C# 中的枚举。谢谢!
猜你喜欢
  • 2012-11-10
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多