2017-05-31 101 views
0

我有一個C++庫,並希望使用痛飲周圍產生一個漂亮的包裝,對於這一點,我創建了以下SWIG接口文件,但我得到了一些問題:SWIG/C#:命名空間和模板

1 - 沒有生成C#命名空間

2 - C++ Expected類很複雜,我希望在C#中創建自己的包裝器(部分類),我需要的是SWIG生成骨架。我將自己提供其餘的實施。有沒有辦法做到這一點 ? (我檢查了文檔,但不清楚)。此外,C#類必須是一個通用類,所以而不是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; 

回答

0
  1. 對於命名空間,我發現生成它們在C#中的唯一方法是將-namespace添加到痛飲包裝。

像:

痛飲 - 命名MYC的#Namespace.MyC#OhterNamespace myfile.i

  • 我想你會發現它感謝另一篇文章。

  • 我從來沒有發現的接口解決方案,因爲它是在C#和C++完全不同,

  • +0

    是的,我知道的命名空間,問題是,每類都必須有自己的名字空間!但是,謝謝 – CDZ

    +0

    所以你應該爲每個類創建一個接口...無聊但唯一的方法,我發現。 –