我使用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
被使用,不能以实际方式使用(或者它可以吗?据我所知,它只能传递,但不能真正使用它。
之前有人处理过这个或类似的问题吗?这是针对自定义类型映射的吗?