使用 SWIG 更改生成的 CS 函数中的返回类型
Posted
技术标签:
【中文标题】使用 SWIG 更改生成的 CS 函数中的返回类型【英文标题】:Changing return type in generated CS function using SWIG 【发布时间】:2020-02-06 12:33:47 【问题描述】:我正在尝试在 C# 中为 C++ 库生成包装器,并使用生成的 C3 包装器来开发客户端应用程序。
C++ 类:
namespace ns
class ISampleInterface
public:
virtual ~ISampleInterface()
virtual void fn(int cnt) = 0;
;
namespace ns
class ISampleInterface2
public:
virtual ~ISampleInterface()
virtual void fn2(int cnt) = 0;
;
namespace ns
class SampleClass
public:
SampleClass()
~SampleClass()
void InputFunction(int count, ISampleInterface sampleInterface, ISampleInterface2& sampleInterface2)
ISampleInterface& OutputFunction(void)
return null;
;
预期的 C# 代码:
namespace csNS
public class SampleClass
public void InputFunction(int count, out SampleInterface sampleInterface, out SampleInterface2 sampleInterface2)
// some code
public SampleInterface OutputFunction()
// some code
Swig 接口声明:
%interface_custom("SampleInterfaceImpl", "SampleInterface", ns::ISampleInterface);
%interface_custom("SampleInterface2Impl", "SampleInterface2", ns::ISampleInterface2);
%Outparams(ns:ISampleInterface, SampleInterfaceImpl)
%Outparams(ns:ISampleInterface2, SampleInterface2Impl)
在上面的 C# 代码中,InputFunction 有 3 个参数。但是,为 SampleInterface 和 SampleInterface2 生成的实现不包含默认构造函数。因此我无法为这些接口创建对象。由于我无法在 C# 端实例化接口,我想将其作为 out 参数传递给 CS 函数,然后将在 C++ 端初始化。因此,要在我定义的 typemap 下面修改在 swig 编译期间生成的 cs 文件。
类型映射声明:
%define %Outparams(TYPE, InterfaceImpl)
%typemap (cstype) TYPE,
TYPE &,
TYPE *,
TYPE *& "out TYPE"
%enddef
使用上面的 typemap 我可以更改输入参数,但是,它也会更改函数返回值,我无法控制它。
实际生成的cs代码:
namespace csNS
public class SampleClass
public void InputFunction(int count, out SampleInterface sampleInterface, out SampleInterface2 sampleInterface2)
// some code
public out SampleInterface OutputFunction()
// some code
我做错了什么???
【问题讨论】:
您已经回答了这个问题。您还在寻找答案,还是只想让问题和答案引起更多关注? 【参考方案1】:我更改了类型映射声明,它起作用了。
类:
%typemap (cstype, out="TYPE") TYPE,
TYPE &,
TYPE *,
TYPE *& "out TYPE"
对于接口:
%typemap (cstype, out="InterfaceImpl") TYPE,
TYPE &,
TYPE *,
TYPE *& "out InterfaceImpl"
CS 文件:
namespace csNS
public class SampleClass
public void InputFunction(int count, out SampleInterface sampleInterface, out SampleInterface2 sampleInterface2)
// some code
public SampleInterfaceImpl OutputFunction()
// some code
【讨论】:
一个很好的解决方案,但它可以使用更多的修补。以上是关于使用 SWIG 更改生成的 CS 函数中的返回类型的主要内容,如果未能解决你的问题,请参考以下文章
如何定义 swig 类型映射以将 unsigned char* 返回到 java
SWIG:如何使用 %apply 返回结构? “未定义类型映射”警告
SWIG 'cstring.i' Python 返回字节类型而不是字符串类型
如何使用 swig 从`unsigned int *`返回`uint []`