sw#in c# - 在便携式类库中找不到HandleRef

时间:2015-06-22 11:19:32

标签: c# .net windows-phone-8.1 swig portable-class-library

我想使用Swig将我的c ++代码包装到c#中。如果C#文件的输出目的地是类库,则没有错误并且成功构建。

但是我想支持windows phone 8.1和windows 8.1因为这个原因我使用的是便携式类库而不是普通的类库。在这种情况下,我收到的错误是:

  

名称空间'System.Runtime.InteropServices'中不存在类型或命名空间名称'HandleRef'(您是否缺少程序集引用?)

我真的不知道自己错过了什么。这个问题的解决方案是什么? 我猜Windows Phone 8.1和Windows 8.1不支持HandleRef,但我不确定。如果是这样,我该怎么办?

1 个答案:

答案 0 :(得分:2)

这个问题有点老了,但在使用.NET Core时遇到了同样的问题,我以为我会分享我的解决方案。

更改imtype和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#"