2017-05-31 52 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

    所以你应该为每个类创建一个接口...无聊但唯一的方法,我发现。 –