我有一些遗留代码,我想要移植到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