#bindings-generator #bindings #code-generation #generated-bindings #log-error

interoptopus

您库的多语言绑定生成器(C#、C、Python、...)。🐙

72 个版本

0.14.26 2024 年 6 月 29 日
0.14.23 2024 年 2 月 14 日
0.14.19 2023 年 9 月 14 日
0.14.18 2023 年 5 月 21 日
0.5.2 2021 年 7 月 30 日

#24 in FFI

Download history 676/week @ 2024-04-30 570/week @ 2024-05-07 586/week @ 2024-05-14 746/week @ 2024-05-21 887/week @ 2024-05-28 521/week @ 2024-06-04 696/week @ 2024-06-11 1123/week @ 2024-06-18 1035/week @ 2024-06-25 1169/week @ 2024-07-02 744/week @ 2024-07-09 717/week @ 2024-07-16 910/week @ 2024-07-23 732/week @ 2024-07-30 549/week @ 2024-08-06 602/week @ 2024-08-13

3,016 每月下载量
6 crates 中使用

MIT 许可证

145KB
2.5K SLoC

Latest Version docs MIT Rust Rust

sample_image

Interoptopus 🐙

您库的多语言绑定生成器。

在 Rust 中编写健壮的库,轻松从您第二喜欢的语言访问它

  • 在 Rust 中设计单个 .dll / .so,从任何地方消耗它。
  • 在具有这些特性的语言中获得 QoL 特性(例如,类、字符串)。
  • 始终有一个理智的、与 C 兼容的 API。
  • 无痛苦的工作流程,无需外部工具。
  • 易于支持更多语言,后端完全与主项目解耦。

我们努力使生成的绑定 无成本。它们应该与您自己合理编写的代码一样地道,但绝对不是魔法或隐藏您真正想要公开的接口。

您编写的代码...

use interoptopus::{ffi_function, ffi_type, Inventory, InventoryBuilder, function};

#[ffi_type]
#[repr(C)]
pub struct Vec2 {
    pub x: f32,
    pub y: f32,
}

#[ffi_function]
#[no_mangle]
pub extern "C" fn my_function(input: Vec2) {
    println!("{}", input.x);
}

// Define our FFI interface as `ffi_inventory` containing
// a single function `my_function`. Types are inferred.
pub fn ffi_inventory() -> Inventory {
    InventoryBuilder::new()
        .register(function!(my_function))
        .inventory()
}

... Interoptopus 生成的

语言 Crates 示例输出1
C# interoptopus_backend_csharp Interop.cs
C interoptopus_backend_c my_header.h
Python interoptopus_backend_cpython reference.py
其他 编写您自己的后端2 -

1 对于 参考项目
2 只需几小时即可添加对新语言的支持。无需拉取请求。 粉红誓言

入门 🍼

如果您想...

支持的 Rust 构造

请参阅参考项目以获取概述。

  • 函数(代码函数和外发代理函数)
  • 类型(复合类型、枚举、不可见类型、引用等)
  • 常量(原始常量;const评估的结果)
  • 模式(ASCII指针、选项、切片、类等)

性能 🏁

生成的底层绑定与该语言的定制绑定相比无任何成本。

尽管如此,即使是定制的绑定在FFI边界也会遇到一些特定于目标的额外开销(例如,在托管语言中的打包或固定)。对于C#,这个成本通常是纳秒级,对于Python CFFI,可能是微秒级。

虽然最终您对语言的FFI性能无能为力,但了解调用成本可以帮助您设计更好的API。

详细的调用成本表可在此处找到:🔥

为了快速概述,此表列出了最常见的调用类型,单位为纳秒/调用

构造函数 C# Python
原始_void() 7 272
原始_u32(0) 8 392
许多参数_5(0, 0, 0, 0, 0) 10 786
回调(x=>x, 0) 43 1168

特性标志

位于derive之后,这些功能启用

  • derive - 诸如ffi_type之类的进程宏...
  • serde - 内部类型上的Serde属性。
  • log - 在FFI错误上调用log

变更日志

  • v0.14 - 更好的库存用户体验。
  • v0.13 - Python后端现在使用ctypes
  • v0.12 - 使用#[ffi_service_method]提高了兼容性。
  • v0.11 - C#将构造函数切换为静态方法。
  • v0.10 - C#风味DotNetUnity(包括Burst)。
  • v0.9 - C#切片速度提高150倍,Python类型提示。
  • v0.8 - 将测试函数移动到各自的后端。
  • v0.7 - 将模式进程宏制作成更好的FFI文档。
  • v0.6 - 重命名并澄清了许多模式。
  • v0.5 - 在Rust和FFI中更好地使用切片。
  • v0.4 - 在自动生成的FFI调用中启用日志支持。
  • v0.3 - 提高泛型的兼容性。
  • v0.2 - 引入了“模式”;C#的工作互操作。
  • v0.1 - 第一个版本。

另外,请参阅我们的升级说明

常见问题解答

贡献

欢迎PR。

  • 直接提交小的错误修复。重大更改应首先作为问题提出。
  • 任何使先前正常工作的绑定更改行为或停止编译的事情都是重大更改;
  • 这并不意味着我们反对破坏东西,只是我们希望在它发生之前讨论它。
  • 新功能或模式必须在参考项目中实现,并至少在一个包含的后端中附带一个互操作测试(即,一个后端测试,它运行C# / Python针对调用该代码的DLL)。

依赖关系

~0–0.8MB
~16K SLoC