我正在尝试使用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#"

10-08 15:37