这个问题有点老了,但是在使用 .NET Core 时遇到了同样的问题,我想我应该分享我的解决方案。
更改 imtype 和 csbody
告诉 SWIG 停止使用HandleRef
你必须改变%typemap(imtype)
and %typemap(csbody)
所有默认(或特定)类型。
imtype
指定出现在您的modulenamePINVOKE
方法参数。将其更改为可以从指针类型编组到指针类型的类型。
csbody
取代你的整个身体SWIGTYPE_
类,这意味着您必须实现自己的(您必须更改存储为的变量HandleRef
)。如果您的新实现没有getCPtr
你必须改变的方法%typemap(csin)
as well
这是一个使用的示例System.IntPtr
代替HandleRef
,将其放在接口文件的顶部:
%typemap(imtype) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "System.IntPtr"
%typemap(csin) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "$csinput.Pointer"
%typemap(csbody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
private volatile System.IntPtr swigCPtr;
protected $csclassname()
{
swigCPtr = System.IntPtr.Zero;
}
internal System.IntPtr Pointer
{
get
{
return swigCPtr;
}
}
%}
Note: SWIGTYPE
是任何类型的占位符。
参考:SWIG 3.0 文档 - 第 20 章“SWIG 和 C#”