从c#中访问c++类枚举值

本文关键字:枚举 c++ 访问 | 更新日期: 2023-09-27 17:50:38

我试图从c#访问c++类头(.h)中的enum。有什么简单的方法吗?我看到的每个示例都涉及将类编译成.dll,对于这个示例来说,这有点浪费,因为该类的功能非常有限。

Edit by request: c++库可以被修改。事实上,c++库是项目(固件)的主要组件,是由我团队的其他成员开发的,c#(我的部分)只是用于单元测试目的。

从c#中访问c++类枚举值

实际上,您有三个选择:

  1. 创建一个glue库,导出一个C函数(extern "C"),该函数包含该头文件并返回您感兴趣的enum值,然后P/从c#调用该库。
  2. 在c#代码中硬编码该值。
  3. 编写一个c++解析器并以这种方式提取值。(一个完整的c++解析器,这是最好的,或者你可以偷懒,写一个简单的正则表达式解析器,它将在这个特定版本的c++头文件上工作,但如果将来代码以你意想不到的方式更改,可能会中断。)

为了访问c++枚举,您必须将c++类转换为。net可以识别的东西,这意味着将其编译为c++/CLI(如果这是一个选项)或转换为。net互操作可以访问的DLL。

好吧,这让CS预编译器有点抓狂,但它构建了:

#if CSHARP
namespace Test
{
    public enum SharedEnum
#endif //CSHARP
#if CPP
    typedef enum SharedEnum 
#endif //CPP
    {
        One,
        Two,
        Three
    }
#if CPP
    SharedEnum 
#endif //CPP
    ;
#if CSHARP
};
#endif

只需将条件编译符号CSHARP添加到您的c#项目,将现有的。cs文件和预处理器定义CPP添加到您的c++项目。

(感谢Yakk有同样的想法)