gpt4 book ai didi

c# - c# 中的 swig - 在可移植类库中找不到 HandleRef

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:35 24 4
gpt4 key购买 nike

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

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

The type or namespace name 'HandleRef' does not exist in the namespace 'System.Runtime.InteropServices' (are you missing an assembly reference?)

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

最佳答案

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


更改 imtype 和 csbody

要告诉 SWIG 停止使用 HandleRef,您必须更改所有默认值的 %typemap(imtype)%typemap(csbody) (或特定的)类型。

imtype 指定出现在您的 modulenamePINVOKE 方法参数中的类型。将其更改为可以从/到指针类型编码的内容。

csbody 替换了整个 SWIGTYPE_ 类,这意味着您必须自己实现(您必须更改存储为 HandleRef)。如果您的新实现没有 getCPtr 方法,您还必须更改 %typemap(csin)

下面是一个使用 System.IntPtr 而不是 HandleRef 的例子,把它放在你的接口(interface)文件的顶部:

%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#"

关于c# - c# 中的 swig - 在可移植类库中找不到 HandleRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30978652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com