C# 在SWIG中使用无符号字符数组的共享\u ptr 我使用Sigg使C++代码可用在C语言中。 任务之一是通过std::shared\u ptr 表示无符号字符的数组。尺寸单独给出。 我认为C语言中合适的表示形式应该是byte[]

C# 在SWIG中使用无符号字符数组的共享\u ptr 我使用Sigg使C++代码可用在C语言中。 任务之一是通过std::shared\u ptr 表示无符号字符的数组。尺寸单独给出。 我认为C语言中合适的表示形式应该是byte[],c#,c++,swig,shared-ptr,C#,C++,Swig,Shared Ptr,不幸的是,我无法管理这个“翻译”。下面是一个示例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

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

%}
只有使用原始指针的第一种方法的签名中有
byte[]
,其余的方法使用的是
SWIGTYPE\u p\u std\u shared\u ptrT\u unsigned\u char\t
,这不能以实际的方式使用(或者可以吗?据我所知,它只能被传递,但不能“真正”使用)

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

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;
  }

}