SWIG:如何传递C++;对象从C#到C++;? 我有一个C++数据类,它存储指向堆分配内存的指针;我可以使用SWIG生成的包装器从C#实例化和使用它。 当我试图调用包装库中的一个函数,该函数需要这些数据类的数组时,我的问题就出现了;我每次都会碰到分段错误。 我尝试了以下两种方法
简而言之,我的情况是SWIG:如何传递C++;对象从C#到C++;? 我有一个C++数据类,它存储指向堆分配内存的指针;我可以使用SWIG生成的包装器从C#实例化和使用它。 当我试图调用包装库中的一个函数,该函数需要这些数据类的数组时,我的问题就出现了;我每次都会碰到分段错误。 我尝试了以下两种方法,c#,c++,swig,C#,C++,Swig,简而言之,我的情况是 class DataClass { char* _data; ... } void printDataClassArray(DataClass *toPrint, std::size_t size) { ... } 函数printDataClassArray默认包装为void printDataClassArray(DataClass-toPrint,int-size),我尝试了两种不同的方法来解决这个问题。我把下面的完整代码贴在下面,以帮助好的灵魂,帮助我:
class DataClass
{
char* _data;
...
}
void printDataClassArray(DataClass *toPrint, std::size_t size)
{ ... }
函数printDataClassArray
默认包装为void printDataClassArray(DataClass-toPrint,int-size)
,我尝试了两种不同的方法来解决这个问题。我把下面的完整代码贴在下面,以帮助好的灵魂,帮助我:<代码>示例。h < /C>包含我正在尝试包装的C++库,<代码>示例。i < />代码包含SWIG接口代码和<代码>消费。Cs<代码>是一个消耗导出函数和类的C函数。
我尝试过研究这个问题,特别是我遵循了这个思路:但我没有找到答案。我不知道我是否遗漏了一些明显的东西,但我认为这应该是SWIG示例的一部分,因为这是一种相当常见的情况
我尝试过两种方法,即使用CSHARP\u数组
和使用array\u类
,但都不起作用。请参阅下面的SWIG代码和下面的完整列表
使用_CSHARP_数组_
CSHARP_ARRAYS(DataClass, DataClass);
%apply DataClass INPUT[]{ DataClass *toprint }
%inline %{
static void PrintAllDataArray(DataClass *toprint, std::size_t size)
{
PrintAllData(toprint, size);
}
%}
使用_数组_类_
// Methodology 2
%array_class(DataClass, DataClassArray);
%inline %{
static void PrintAllVariants(DataClassArray va, std::size_t size)
{
PrintAllData(DataClassArray_cast(&va), size);
}
%}
例h
经过大量调查,为了避免使用
std::vector
,采取了极端的做法,一位朋友建议了一个非常简单的解决方案:在方法2中更改helper函数的签名,以通过引用传递DataClassArray
,因此:
static void PrintAllVariants(DataClassArray va, std::size_t size)
到
希望能有帮助
%module example
%include "std_string.i"
%include "arrays_csharp.i"
%include "carrays.i"
#ifdef _WIN32
%include <windows.i>
#endif
%inline %{
namespace std {
typedef unsigned int size_t;
}
%}
%ignore DataEncapsulator;
%ignore copyString;
%ignore copyData;
%ignore deleteString;
%{
#include "example.h"
%}
%rename(copy) *::operator=;
%include "example.h"
// Methodology 1
CSHARP_ARRAYS(DataClass, DataClass);
%apply DataClass INPUT[]{ DataClass *toprint }
%inline %{
static void PrintAllDataArray(DataClass *toprint, std::size_t size)
{
PrintAllData(toprint, size);
}
%}
// Methodology 2
%array_class(DataClass, DataClassArray);
%inline %{
static void PrintAllVariants(DataClassArray va, std::size_t size)
{
PrintAllData(DataClassArray_cast(&va), size);
}
%}
var a = new DataClass("first");
var b = new DataClass("second");
// Methodology 1
DataClassArray va = new DataClassArray(2);
va.setitem(0, a);
va.setitem(1, b);
example.PrintAllVariants(va, 2);
// Methodology 2
DataClass[] da = new DataClass[2];
da[0] = a;
da[1] = b;
example.PrintAllDataArray(da, 2);
Console.WriteLine();
static void PrintAllVariants(DataClassArray va, std::size_t size)
static void PrintAllVariants(DataClassArray &va, std::size_t size)