我想使用Swig将我的c ++代码包装到c#中。如果C#文件的输出目的地是类库,则没有错误并且成功构建。
但是我想支持windows phone 8.1和windows 8.1因为这个原因我使用的是便携式类库而不是普通的类库。在这种情况下,我收到的错误是:
名称空间'System.Runtime.InteropServices'中不存在类型或命名空间名称'HandleRef'(您是否缺少程序集引用?)
我真的不知道自己错过了什么。这个问题的解决方案是什么? 我猜Windows Phone 8.1和Windows 8.1不支持HandleRef,但我不确定。如果是这样,我该怎么办?
答案 0 :(得分:2)
这个问题有点老了,但在使用.NET Core时遇到了同样的问题,我以为我会分享我的解决方案。
要告知SWIG停止使用HandleRef
,您必须更改所有默认(或特定)类型的%typemap(imtype)
和%typemap(csbody)
。
imtype
指定modulenamePINVOKE
方法参数中显示的类型。将其更改为可以从/向指针类型封送的内容。
csbody
替换了SWIGTYPE_
类的整个主体,这意味着您必须自己实现(您必须更改存储为HandleRef
的变量)。如果您的新实施没有getCPtr
方法,则还必须更改%typemap(csin)
以下示例使用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;
}
}
%}
注意:SWIGTYPE
是任何类型的占位符。