#c-sharp #bindings-generator #binding #ffi #bindgen

csharp_binder

用于生成 Rust 外部函数接口 (FFI) 的 C# 绑定的库

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 模式

Download history 10/week @ 2024-03-31 1/week @ 2024-04-07

52 个月下载量
csbinding_generator 中使用

MIT 许可证

74KB
2K SLoC

crates.io

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