来自现有 C API 的 SWIG C#

本文关键字:SWIG API | 更新日期: 2023-09-27 18:32:25

我有一个纯C库,其标头是从Perl中的自定义IDL生成的。我想迁移到SWIG(或其他生成器)以消除对Perl的依赖。我也喜欢SWIG附带的免费生成的Python和Ruby包装器。

我目前生成一个 C# 包装器,它需要将父级的概念传递给构造函数:

// Pure C API
b = StructB_Create(a);
// not safe to free a until b is freed
// C# wrapper ctor 
B(ClassA a)
{
  this.parent = a; // ref to prevent gc of a
}

以这种方式将SWIG与现有的纯C API一起使用是否容易?

来自现有 C API 的 SWIG C#

即使 SWIG 无法自动为您创建引用计数,它也具有良好的调整结果代码的能力。 (我在 Python 中对 refs 做了类似的事情)。 您可以自定义生成的 C#,也可以从 SWIG .i 文件中增强事物的 C 端。

使用 .i 文件,可以将方法添加到类中,也可以向目标语言中的现有方法添加前缀或后缀代码。 几乎所有您可能需要的东西都可以得到满足。 例如,请参阅 http://www.swig.org/Doc2.0/CSharp.html#CSharp_extending_proxy_class

doco并不总是很容易遵循,但从长远来看是值得的。 特别是如果您有多种目标语言。