【问题标题】:SWIG / C# : namespace and templatesSWIG / C#:命名空间和模板
【发布时间】: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;

【问题讨论】:

    标签: c# c++ namespaces swig


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

    喜欢:

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

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

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

    【讨论】:

    • 是的,我知道命名空间,问题是每个类都必须有自己的命名空间!不过谢谢
    • 所以你应该为每个类创建一个接口......很无聊,但我发现的唯一方法。
    猜你喜欢
    • 2010-12-29
    • 2015-06-22
    • 1970-01-01
    • 2011-04-11
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多