我有一些遺留代碼,我想要移植到C#。我不能修改C++代碼,我只需要處理我提供的內容。SWIG:C++到C#,指向指針編組的指針
所以,情況。我使用痛飲,我碰到這個功能來:
void MarshalMe(int iNum, FooClass** ioFooClassArray);
如果我跑了SWIG這樣,就不會知道如何處理數組做的,所以它會創建一個SWIGTYPE_p_pFooClass。很公平! 此C#代碼看起來像
void MarshalMe(int iNum, SWIGTYPE_p_p_FooClass ioFooClassArray); // Not ideal!
有一些技巧正確編組這種代碼,所以我嘗試了幾個:
%typemap(ctype) FooClass** "FooClass**"
%typemap(cstype) FooClass** "FooClass[]"
%typemap(imtype, inattributes="[In, Out, MarshalAs(UnmanagedType.LPArray)]") FooClass** "FooClass[]"
%typemap(csin) FooClass** "$csinput"
%typemap(in) FooClass** "$1 = $input;"
%typemap(freearg) FooClass** ""
%typemap(argout) FooClass** ""
這有效地創建一個更好的簽名:
void MarshalMe(int iNum, FooClass[] ioFooClassArray); // Looks good! Would it work?
然而,當我嘗試運行它,我得到以下錯誤:
{"Exception of type 'System.ExecutionEngineException' was thrown."}
有關實際類型圖的任何想法?
這已經有一段時間,因爲我感動C++所以請糾正我,如果我在這裏是錯誤的,但不FooClass **暗示你處理二維對象? **指定尺寸的數量。 – 2010-03-19 18:50:02