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使用类型,但不能以实际方式使用(或者可以吗?据我了解,它只能传递,但不能传递)用“真的”)。
以前有人处理过这个问题或类似的问题吗?这是自定义类型映射的东西吗?
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |