13 个版本
0.3.1 | 2021 年 2 月 15 日 |
---|---|
0.3.0 | 2021 年 2 月 13 日 |
0.2.2 | 2021 年 2 月 10 日 |
0.1.7 | 2021 年 2 月 9 日 |
#1866 in Rust 模式
52 个月下载量
在 csbinding_generator 中使用
74KB
2K SLoC
CSharp_Binder
CSharp_Binder 是一个用于生成 Rust FFI (外部函数接口) 的 C# 绑定的工具。通过使用 extern C 函数进行交互,它允许您轻松地从 C# 调用 Rust 函数,而无需自己编写 extern C# 函数。
CSharp_Binder 会解析给定的 Rust 脚本,并提取任何标记为 extern "C" 的函数、具有 [repr(u*)]
属性的枚举以及具有 #[repr(C)]
属性的结构体。然后,它将这些转换为 C# 中的适当表示。
CSharp_Binder 还会提取函数、枚举及其变体、结构体及其字段的 Rust 文档,并将其转换为生成的 C# 代码上的 XML 文档。
注意,CSharp_Binder 使用 syn 解析 Rust 脚本,因此宏不会被展开!如果您有需要在宏内部提取的函数、结构体或枚举,请确保先运行 cargo-expand。
示例
示例
use csharp_binder::{CSharpConfiguration, CSharpBuilder};
fn main(){
// Create C# configuration with C# target version 9.
let mut configuration = CSharpConfiguration::new(9);
let rust_file = r#"
/// Just a random return enum
#[repr(u8)]
enum ReturnEnum {
Val1,
Val2,
}
/// An input struct we expect
#[repr(C)]
struct InputStruct {
field_a: u16,
/// This field is used for floats!
field_b: f64,
}
pub extern "C" fn foo(a: InputStruct) -> ReturnEnum {
}
"#;
let mut builder = CSharpBuilder::new(rust_file, "foo", &mut configuration)
.expect("Failed to parse file");
builder.set_namespace("MainNamespace");
builder.set_type("InsideClass");
let script = builder.build().expect("Failed to build");
}
这将返回以下 C# 代码
// Automatically generated, do not edit!
using System;
using System.Runtime.InteropServices;
namespace MainNamespace
{
internal static class InsideClass
{
/// <summary>
/// Just a random return enum
/// </summary>
public enum ReturnEnum : byte
{
Val1,
Val2,
}
/// <summary>
/// An input struct we expect
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct InputStruct
{
/// <remarks>u16</remarks>
public ushort FieldA { get; init; }
/// <summary>
/// This field is used for floats!
/// </summary>
/// <remarks>f64</remarks>
public double FieldB { get; init; }
public InputStruct(ushort fieldA, double fieldB)
{
FieldA = fieldA;
FieldB = fieldB;
}
}
/// <param name="a">InputStruct</param>
/// <returns>ReturnEnum</returns>
[DllImport("foo", CallingConvention = CallingConvention.Cdecl, EntryPoint="foo")]
internal static extern ReturnEnum Foo(InputStruct a);
}
}
依赖关系
~1.5MB
~35K SLoC