我必须扩展C ++ API(我的论文项目的Cinema 4D SDK)的包装,由学生团队用SWIG 3.0包装到c#。我无法更改任何API代码。
现在,我正在努力包装一个特定的功能。该函数在C ++ c4d_nodedata.h
文件中定义如下:
virtual Bool Message(GeListNode* node, Int32 type, void* data);
如果我在SWIG .I
文件中没有执行任何具体操作,则函数将包含在此:
public virtual bool Message(GeListNode node, int type, SWIGTYPE_p_void data) {
bool ret = C4dApiPINVOKE.NodeData_Message(swigCPtr, GeListNode.getCPtr(node), type, SWIGTYPE_p_void.getCPtr(data));
return ret;
}
此函数是API中消息传递系统的一部分,对于参数data
,特定对象的调用类型为DocumentInfoData
:
public override bool Message(GeListNode node, int type, SWIGTYPE_p_void data)
所以在C ++中,它是一个基本的无效指针,我可以对我的DocumentInfoData
类型对象进行投射,然后对此进行处理。在C#中我无法强制转换,因为SWIGTYPE_p_void
中的所有方法都是私有的或标准内部的 - 所以没有getter等。
我现在尝试用swig中的%typemap
包装它。 %typemap
看起来像这样:
%typemap(ctype) void*, void*& "void* /* void* */"
%typemap(in) void* %{ $1 = (void*)$input; /* void*_in */%}
%typemap(in) void*& %{ $1 = (void**)&$input; /* void*&_in */%}
%typemap(imtype, out="global::System.IntPtr") void*, void*& "DocumentInfoData /* DocumentInfoData_imtype */"
%typemap(cstype, out="global::System.IntPtr") void*, void*& "DocumentInfoData /* DocumentInfoData_cstype */"
%typemap(csin) void*, void*& "$csinput /* DocumentInfo_csin */"
这会将参数值包装为正确的DocumentInfoData
类型。但是我的%typemaps
覆盖了%typemap
等其他方法的错误,例如,我们通常不会将void*
强制转换为DocumentInfoData
而是做一些不同的事情。
有没有办法只在某些特定功能上使用这样的SWIG %typemaps
?我知道SWIG doc中的范围部分。但它似乎只适用于内联代码。
我也知道this的问题,但没有得到合适的答案。