【发布时间】:2011-01-29 14:26:44
【问题描述】:
我有一些遗留代码想要移植到 C#。我无法修改 C++ 代码,我只需要使用我所提供的内容。
所以,情况。我正在使用 SwIG,我遇到了这个功能:
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** 不是暗示你正在处理二维对象吗? ** 指定维数。
标签: c# c++ pointers marshalling swig