【问题标题】:How do I use SWIG typemaps to marshall structure members from C++ to C# using P/Invoke?如何使用 SWIG 类型映射通过 P/Invoke 将结构成员从 C++ 编组到 C#?
【发布时间】:2011-09-07 08:03:30
【问题描述】:

鉴于以下 SWIG 接口定义:

%module example

%include "arrays_csharp.i"
%apply int INOUT[] {int *x}

struct mystruct
{
        int *x;
}

SWIG 产生以下内容(来自 mystruct.cs 的 sn-p):

  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[]'

在上面代码sn-p标记的区域。

我按照http://www.swig.org/Doc1.3/CSharp.html#CSharp_arrays_pinvoke_default_array_marshalling开发的接口,只讲功能不讲结构。结构成员的接口定义应该不同吗?

【问题讨论】:

    标签: c# c++ swig


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多