适用于您的库的多语言绑定生成器。
用 Rust 编写一个强大的库,从您第二喜欢的语言轻松访问它:
在 Rust 中设计单个.dll
/ .so
,从任何地方使用它。
以具有 QoL 功能(例如,类、字符串)的语言获取这些功能。
始终拥有一个健全的、与 C 兼容的 API。
无痛工作流程,无需外部工具。
易于支持更多语言,后端与主项目完全解耦。
我们努力使我们生成的绑定零成本。它们应该像您自己合理编写的那样符合惯用法,但绝不要魔术或隐藏您真正想要公开的界面。
use interoptopus::{ffi_function, ffi_type, Inventory, InventoryBuilder, function};#[ffi_type]pub struct Vec2 {pub x: f32,pub y: f32,}#[ffi_function]pub fn my_function(input: Vec2) {println! ("{}", input.x);}// 将我们的 FFI 接口定义为包含 // 单个函数的 `ffi_inventory` `我的函数`。类型为 inferred.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
语言 | 箱 | 样本输出1 |
---|---|---|
C# | interoptopus_backend_csharp | 互操作性cs |
C | interoptopus_backend_c | my_header.h |
Python | interoptopus_backend_cpython | 参考.py |
其他 | 编写自己的后端2 | - |
1供参考项目。
2在短短几个小时内添加对新语言的支持。无需拉取请求。萍琪派承诺。
如果你想 ...
开始看看你好世界,
产品化您的项目,查看真实的项目布局,
了解什么是可能的,请参阅参考项目,
支持新语言,复制C后端。
请参阅参考项目以了解概述:
职能(独立职能和代表)
类型(复合、枚举、不透明、引用……)
常量(原始常量;const 求值的结果)
模式(ASCII 指针、选项、切片、类……)
生成的低级绑定是针对该语言手工制作的绑定的零成本。
也就是说,即使是手工制作的绑定也会在 FFI 边界处遇到一些特定于目标的开销(例如,托管语言中的编组或固定)。对于 C#,该成本通常为纳秒,对于 Python CFFI 则可能为微秒。
虽然最终您对语言的 FFI 性能无能为力,但了解调用成本可以帮助您设计更好的 API。
详细的通话费用表可以在这里找到:
C# 调用开销
Python 调用开销
为了快速概览,此表列出了ns / call中最常见的调用类型:
构造 | C# | Python |
---|---|---|
primitive_void() | 7 | 第272章 |
primitive_u32(0) | 8 | 第392章 |
many_args_5(0, 0, 0, 0, 0) | 10 | 第786章 |
callback(x => x, 0) | 43 | 1168 |
在功能标志后面进行门控,这些功能可以:
derive
- Proc 宏,例如ffi_type
,...
serde
- 内部类型的 Serde 属性。
log
- 调用 FFI 错误日志。
v0.15 - 大规模清理、错误修复、用户体验大修(+syn2)。
v0.14 - 更好的库存用户体验。
v0.13 - Python 后端现在使用ctypes
。
v0.12 - 使用#[ffi_service_method]
更好地兼容。
v0.11 - C# 将 ctor 切换为静态方法。
v0.10 - C# 风格的DotNet
和Unity
(包括 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。
直接提交小错误修复。重大变化首先应该是问题。
任何使先前工作的绑定改变行为或停止编译的事情都是重大变化;
这并不意味着我们反对破坏东西,只是我们想在它发生之前讨论它。
新功能或模式必须在参考项目中具体化,并至少在一个包含的后端中进行互操作测试(即针对调用该代码的 DLL 运行 C#/Python 的后端测试)。