我正在尝试使用Swig将c ++代码包装到c#中。如果C#文件的输出目标是class library,则没有错误并且可以成功构建。
但是我想同时支持Windows Phone 8.1和Windows 8.1,因为这个原因,我使用的是可移植类库,而不是普通类库。在这种情况下,我会收到错误消息:
类型或名称空间名称“ HandleRef”在名称空间“ System.Runtime.InteropServices”中不存在(您是否缺少程序集引用?)
我真的不知道我在想什么。这个问题的解决办法是什么?
我猜Windows Phone 8.1和Windows 8.1不支持HandleRef,但我不确定。如果是这样,我该怎么办?
最佳答案
这个问题有点老了,但是在使用.NET Core时遇到了同样的问题,我想我应该分享我的解决方案。
更改字体和csbody
要告诉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
是任何类型的占位符。参考:
SWIG 3.0 Documentation - Chapter 20 "SWIG and C#"