【问题标题】:swig in c# - HandleRef could not be found in portable class libraryc# 中的 swig - 在可移植类库中找不到 HandleRef
【发布时间】:2015-06-22 11:19:32
【问题描述】:

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

但是我想同时支持 windows phone 8.1 和 windows 8.1,因为这个原因我使用的是可移植类库而不是普通类库。在这种情况下,我收到错误消息;

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

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

【问题讨论】:

  • HandleRef 在 PCL 中不受支持(您可以从 MSDN 检查)。您可以将其替换为 IntPtr(假设您需要它),但在这种情况下,您必须自己小心避免 GC 问题(处理 GCed 的对象,因为不在使用)。
  • @AdrianoRepetti 如果我需要用 IntPtr 替换 HandleRef ,我该怎么做? Swig 自动使用 HandleRef,但我看不到任何示例/指南来告诉我如何更改它。
  • 可能相当复杂...在 Swig 的 Lib\csharp\* 中有 61 个 HandleRef 引用...

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


【解决方案1】:

这个问题有点老了,但是在使用 .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#"

【讨论】:

  • 请您提供有关如何解决此问题的更多详细信息?应该在哪里应用这些更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多