如何使用P/Invoke使用SWIG类型映射将结构成员从c++编组到c#

How do I use SWIG typemaps to marshall structure members from C++ to C# using P/Invoke?

本文关键字:成员 结构 c++ 映射 何使用 Invoke 使用 类型 SWIG      更新时间:2023-10-16

给定以下SWIG接口定义:

%module example
%include "arrays_csharp.i"
%apply int INOUT[] {int *x}
struct mystruct
{
        int *x;
}

SWIG生成以下代码(来自mystruct.cs的片段):

  public int[] x {
    set {
      examplePINVOKE.mystruct_x_set(swigCPtr, value);
    } 
    get {
      IntPtr cPtr = examplePINVOKE.mystruct_x_get(swigCPtr); // Error 1
      SWIGTYPE_p_int ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_int(cPtr, false);
      return ret; //Error 2
    } 
  }

这会导致VS2010产生以下两个错误:

Error   1   Cannot implicitly convert type 'int[]' to 'System.IntPtr'   
Error   2   Cannot implicitly convert type 'LibLinear.SWIG.SWIGTYPE_p_int' to 'int[]'

在上面代码片段中标记的区域。

我根据http://www.swig.org/Doc1.3/CSharp.html#CSharp_arrays_pinvoke_default_array_marshalling开发了接口,它只讨论功能而不讨论结构。结构成员的接口定义应该不同吗?

它可能无法处理结构体数组,因为内存中未知的大小/布局(这不是int/double/etc…的问题)。你有可能使用结构体的向量代替吗?我没有问题通过简单地包括std_vector.i和相关的类型映射传递结构或自定义对象的向量,例如:

%include "std_vector.i"
%typemap(MyClassVec) std::vector<MyClass>;