SWIG / C#:命名空间和模板

Posted

技术标签:

【中文标题】SWIG / C#:命名空间和模板【英文标题】:SWIG / C# : namespace and templates 【发布时间】:2017-05-31 08:39:06 【问题描述】:

我有一个 C++ 库并希望使用 SWIG 生成一个很好的包装器,为此,我创建了以下 SWIG 接口文件,但遇到了一些问题:

1 - 没有生成 C# 命名空间

2 - C++ Expected 类很复杂,我希望在 C# 中创建自己的包装器(示例的部分类),我只需要 SWIG 生成骨架。我将自己提供其余的实现。有没有办法做到这一点 ? (我已经检查了文档。但不清楚)。此外,C# 类必须是一个泛型类,所以我将使用 Expected 等代替 Expected_Void...

3 - 有没有办法强制 SWIG 生成接口而不是类? (对于C++类IViewHandle)

这是我的 .i 文件

%module sdk
%
  #include "../include/sdk/core/Expected.hpp"
  #include "../include/luciadsdk/view/IViewHandle.hpp"
  #include "../include/sdk/view/IViewContext.hpp"
  #include "../include/sdk/view/ViewContext.hpp"
%

%include <windows.i>

%nodefaultctor;

//--------------------------------------------------
// Expected<T>
//--------------------------------------------------

%nspace sdk::core;
namespace sdk 
namespace core 

  template<typename T>
  class Expected
  
  public:
  ;

  %template(Expected_Int)   Expected<int>;
  %template(Expected_Float) Expected<float>;
  %template(Expected_Bool)  Expected<bool>;
  %template(Expected_Void)  Expected<void>;

 

//--------------------------------------------------
// IViewHandle
//--------------------------------------------------

%nspace sdk::view;
namespace sdk 
namespace view 

  class IViewHandle
  
  public:
  ;

 

//--------------------------------------------------
// IViewContext
//--------------------------------------------------

%nspace sdk::view;
namespace sdk 
namespace view 

  class IViewContext
  
  public:

    virtual sdk::Expected<void> setHandle(const IViewHandle& handle) = 0;

    virtual void invalidate() = 0;

    protected:
      IViewContext() = default;
      ~IViewContext() = default;
  ;

 

//--------------------------------------------------
// ViewContext
//--------------------------------------------------

%nspace sdk::view;
namespace sdk 
namespace view 

  class ViewContext : public IViewContext
  
  public:
    ViewContext();
    ~ViewContext();

    sdk::Expected<void> setHandle(const IViewHandle& handle) override;

    void invalidate() override;
  ;

 

%clearnodefaultctor;

【问题讨论】:

【参考方案1】:
    对于命名空间,我发现在 C# 中生成它们的唯一方法是将 -namespace 添加到 swig 包装器中。

喜欢:

swig -namespace MyC#Namespace.MyC#OhterNamespace myfile.i

    我想你是通过其他帖子找到的。

    我从来没有找到接口的解决方案,因为它在 C# 和 C++ 中完全不同,

【讨论】:

是的,我知道命名空间,问题是每个类都必须有自己的命名空间!不过谢谢 所以你应该为每个类创建一个接口......很无聊,但我发现的唯一方法。

以上是关于SWIG / C#:命名空间和模板的主要内容,如果未能解决你的问题,请参考以下文章

使用命名空间之外的 T4 模板位置

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

C# 常用 命名空间都有哪些 这些命名空间是的作用是?

C#命名空间大全详细教程

当顶层命名空间包含基类而内部命名空间包含子类时的 C# 命名空间和类/子类命名约定

C#中jobject 命名空间的啥