如何通过SWIG公开名称空间的C++字符串常量?(C#)

How do I expose namespaced C++ string constants via SWIG? (C#)

本文关键字:常量 字符串 C++ 空间 SWIG 何通过      更新时间:2023-10-16

在C++中有多种方法可以公开名称空间的编译时常量字符串。

我有一堆我想通过SWIG在C++和C#之间共享的东西,这样我就可以在C++中这样引用它们:

Foo::Bar::SomeConstant

像这样在C#中:

Foo.Bar.SomeConstant

我真的不在乎C++方面是const char*还是std::string,但我确实需要名称空间来避免冲突。

我宁愿把它放在一个头文件中:

namespace Foo
{
    namespace Bar
    {
        const char* const SomeConstant = "hello world";
    }
}

但我似乎无法让C队用SWIG打球。实现这一目标的最佳方式是什么?

我最终通过在命名空间中嵌套结构并为它们提供私有构造函数和公共静态conststd::字符串成员(填充在单独的cpp文件中)来解决这个问题。

这在pinvoke生成的代码中创建了getter,SWIG用静态只读C#属性包装这些代码,而这些属性只使用getter,这正是我想要的。

值得注意的是,每次使用C#属性时都会生成一个C#字符串(而不是在C#-land中生成一个静态实例),但这对我的用例来说很好。