在SWIG

时间:2016-11-17 15:32:44

标签: c# c++ swig shared-ptr

我使用SWIG在C#中提供C ++代码。 其中一项任务是通过std::shared_ptr<unsigned char>交换数据 表示无符号字符数组。尺寸单独给出。 我认为C#中的合适表示形式为byte[]

不幸的是我无法管理这个&#34;翻译&#34;。这是一个示例SWIG接口文件:

%module example
%include <stdint.i>
%include <std_pair.i>
%include <std_shared_ptr.i>
%include <arrays_csharp.i>

// would result in compile error: "error C2679: binary '=' : no operator found which takes a right-hand operand of type 'unsigned char *' (or there is no acceptable conversion)"
//%apply unsigned char INPUT[]  {std::shared_ptr<unsigned char>}
//%apply unsigned char OUTPUT[] {std::shared_ptr<unsigned char>}

%apply unsigned char INPUT[]  {unsigned char*}
%apply unsigned char OUTPUT[] {unsigned char*}

%apply unsigned int {std::size_t}

%template (MyDataPair) std::pair<std::shared_ptr<unsigned char>, std::size_t>;

%inline %{
#include <memory>

typedef std::pair<std::shared_ptr<unsigned char>,std::size_t> MyDataPair;

struct MyDataStruct
{
    std::shared_ptr<unsigned char> data;
    std::size_t size;

    MyDataStruct(std::shared_ptr<unsigned char> p_data, std::size_t p_size) : data(p_data), size(p_size) {}
};

void setDataWithPointer(unsigned char* p_data, std::size_t p_size);

void setDataWithSharedPointer(std::shared_ptr<unsigned char> p_data, std::size_t p_size);

std::shared_ptr<unsigned char> getDataOfPair(const MyDataPair p_data) {
    return p_data.first;
}

std::shared_ptr<unsigned char> getDataOfStruct(const MyDataStruct p_data) {
    return p_data.data;
}

%}

输出如下(在example.cs中生成):

public class example {
  public static void setDataWithPointer(byte[] p_data, uint p_size) {
    examplePINVOKE.setDataWithPointer(p_data, p_size);
  }

  public static void setDataWithSharedPointer(SWIGTYPE_p_std__shared_ptrT_unsigned_char_t p_data, uint p_size) {
    examplePINVOKE.setDataWithSharedPointer(SWIGTYPE_p_std__shared_ptrT_unsigned_char_t.getCPtr(p_data), p_size);
    if (examplePINVOKE.SWIGPendingException.Pending) throw examplePINVOKE.SWIGPendingException.Retrieve();
  }

  public static SWIGTYPE_p_std__shared_ptrT_unsigned_char_t getDataOfPair(MyDataPair p_data) {
    SWIGTYPE_p_std__shared_ptrT_unsigned_char_t ret = new SWIGTYPE_p_std__shared_ptrT_unsigned_char_t(examplePINVOKE.getDataOfPair(MyDataPair.getCPtr(p_data)), true);
    if (examplePINVOKE.SWIGPendingException.Pending) throw examplePINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static SWIGTYPE_p_std__shared_ptrT_unsigned_char_t getDataOfStruct(MyDataStruct p_data) {
    SWIGTYPE_p_std__shared_ptrT_unsigned_char_t ret = new SWIGTYPE_p_std__shared_ptrT_unsigned_char_t(examplePINVOKE.getDataOfStruct(MyDataStruct.getCPtr(p_data)), true);
    if (examplePINVOKE.SWIGPendingException.Pending) throw examplePINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

}

只有使用原始指针的第一个方法在其签名中有byte[],其余类型SWIGTYPE_p_std__shared_ptrT_unsigned_char_t被使用,不能以实际方式使用(或者它可以吗?据我所知,它只能传递,但不能真正使用它。

之前有人处理过这个或类似的问题吗?这是针对自定义类型映射的吗?

0 个答案:

没有答案