在 SWIG 中使用 unsigned char 数组的共享指针

sap*_*api 5 c# c++ swig shared-ptr

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

不幸的是我无法管理这个“翻译”。以下是 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;
}

%}
Run Code Online (Sandbox Code Playgroud)

输出如下所示(在 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;
  }

}
Run Code Online (Sandbox Code Playgroud)

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

以前有人处理过这个问题或类似的问题吗?这是自定义类型映射的东西吗?