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

时间:2017-05-31 08:39:07

标签: c# c++ namespaces swig

我有一个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 个答案:

答案 0 :(得分:0)

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

      

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

    1. 我认为你可以通过另一篇帖子找到它。

    2. 我从未找到过接口的解决方案,因为它在C#和C ++中完全不同,