2011-09-07 63 views
3

給定以下SWIG接口定義:如何使用SWIG typemaps將結構成員從C++用P/Invoke編組爲C#?

%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,它只談論功能而不是結構。結構成員的接口定義是否應該不同?

回答

0

這可能是因爲內存中未知的大小/佈局(這對int/double/etc不是問題),它無法處理結構數組。是否可以使用結構向量來代替?通過簡單地包括std_vector.i和相關的類型映射,我沒有傳遞結構向量或自定義對象的問題,例如:

%include "std_vector.i" 

%typemap(MyClassVec) std::vector<MyClass>;