mirror of
https://github.com/Sarsoo/csbindgen.git
synced 2024-12-23 06:56:27 +00:00
support NonZero
This commit is contained in:
parent
510750c6b6
commit
6e27a5ba08
46
README.md
46
README.md
@ -31,7 +31,7 @@ Install on `Cargo.toml` as `build-dependencies` and set up `bindgen::Builder` on
|
|||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
csbindgen = "1.7.4"
|
csbindgen = "1.7.5"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Rust to C#.
|
### Rust to C#.
|
||||||
@ -423,21 +423,6 @@ Rust types will map these C# types.
|
|||||||
|
|
||||||
| Rust | C# |
|
| Rust | C# |
|
||||||
| ---- | -- |
|
| ---- | -- |
|
||||||
| `c_char` | `byte` |
|
|
||||||
| `c_schar` | `sbyte` |
|
|
||||||
| `c_uchar` | `byte` |
|
|
||||||
| `c_short` | `short` |
|
|
||||||
| `c_ushort` | `ushort` |
|
|
||||||
| `c_int` | `int` |
|
|
||||||
| `c_uint` | `uint` |
|
|
||||||
| `c_long` | `CLong` |
|
|
||||||
| `c_ulong` | `CULong` |
|
|
||||||
| `c_longlong` | `long` |
|
|
||||||
| `c_ulonglong` | `ulong` |
|
|
||||||
| `c_float` | `float` |
|
|
||||||
| `c_double` | `double` |
|
|
||||||
| `c_void` | `void` |
|
|
||||||
| `CString` | `sbyte` |
|
|
||||||
| `i8` | `sbyte` |
|
| `i8` | `sbyte` |
|
||||||
| `i16` | `short` |
|
| `i16` | `short` |
|
||||||
| `i32` | `int` |
|
| `i32` | `int` |
|
||||||
@ -455,6 +440,33 @@ Rust types will map these C# types.
|
|||||||
| `bool` | `[MarshalAs(UnmanagedType.U1)]bool` |
|
| `bool` | `[MarshalAs(UnmanagedType.U1)]bool` |
|
||||||
| `char` | `uint` |
|
| `char` | `uint` |
|
||||||
| `()` | `void` |
|
| `()` | `void` |
|
||||||
|
| `c_char` | `byte` |
|
||||||
|
| `c_schar` | `sbyte` |
|
||||||
|
| `c_uchar` | `byte` |
|
||||||
|
| `c_short` | `short` |
|
||||||
|
| `c_ushort` | `ushort` |
|
||||||
|
| `c_int` | `int` |
|
||||||
|
| `c_uint` | `uint` |
|
||||||
|
| `c_long` | `CLong` |
|
||||||
|
| `c_ulong` | `CULong` |
|
||||||
|
| `c_longlong` | `long` |
|
||||||
|
| `c_ulonglong` | `ulong` |
|
||||||
|
| `c_float` | `float` |
|
||||||
|
| `c_double` | `double` |
|
||||||
|
| `c_void` | `void` |
|
||||||
|
| `CString` | `sbyte` |
|
||||||
|
| `NonZeroI8` | `sbyte` |
|
||||||
|
| `NonZeroI16` | `short` |
|
||||||
|
| `NonZeroI32` | `int` |
|
||||||
|
| `NonZeroI64` | `long` |
|
||||||
|
| `NonZeroI128` | `Int128` |
|
||||||
|
| `NonZeroIsize` | `nint` |
|
||||||
|
| `NonZeroU8` | `byte` |
|
||||||
|
| `NonZeroU16` | `ushort` |
|
||||||
|
| `NonZeroU32` | `uint` |
|
||||||
|
| `NonZeroU64` | `ulong` |
|
||||||
|
| `NonZeroU128` | `UInt128` |
|
||||||
|
| `NonZeroUsize` | `nuint` |
|
||||||
| `#[repr(C)]Struct` | `[StructLayout(LayoutKind.Sequential)]Struct` |
|
| `#[repr(C)]Struct` | `[StructLayout(LayoutKind.Sequential)]Struct` |
|
||||||
| `#[repr(C)]Union` | `[StructLayout(LayoutKind.Explicit)]Struct` |
|
| `#[repr(C)]Union` | `[StructLayout(LayoutKind.Explicit)]Struct` |
|
||||||
| `#[repr(u*/i*)]Enum` | `Enum` |
|
| `#[repr(u*/i*)]Enum` | `Enum` |
|
||||||
@ -467,6 +479,8 @@ Rust types will map these C# types.
|
|||||||
| `*const *const T` | `T**` |
|
| `*const *const T` | `T**` |
|
||||||
| `*mut *const T` | `T**` |
|
| `*mut *const T` | `T**` |
|
||||||
| `*const *mut T` | `T**` |
|
| `*const *mut T` | `T**` |
|
||||||
|
| `NonNull<T>` | `T*` |
|
||||||
|
| `Box<T>` | `T*` |
|
||||||
|
|
||||||
csbindgen is designed to return primitives that do not cause marshalling. It is better to convert from pointers to Span yourself than to do the conversion implicitly and in a black box. This is a recent trend, such as the addition of [DisableRuntimeMarshalling](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.disableruntimemarshallingattribute) from .NET 7.
|
csbindgen is designed to return primitives that do not cause marshalling. It is better to convert from pointers to Span yourself than to do the conversion implicitly and in a black box. This is a recent trend, such as the addition of [DisableRuntimeMarshalling](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.disableruntimemarshallingattribute) from .NET 7.
|
||||||
|
|
||||||
|
23
csbindgen-tests/src/lib.rs
vendored
23
csbindgen-tests/src/lib.rs
vendored
@ -1,6 +1,8 @@
|
|||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
ffi::{c_char, c_long, c_ulong, CString}, ptr::NonNull, num::NonZeroI8,
|
ffi::{c_char, c_long, c_ulong, CString},
|
||||||
|
num::*,
|
||||||
|
ptr::NonNull,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
@ -171,33 +173,26 @@ pub extern "C" fn event(event: event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_func_issue_39(_f: extern "C" fn(i32)){
|
pub extern "C" fn test_func_issue_39(_f: extern "C" fn(i32)) {}
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_func_issue_39_variation1(_f: extern "C" fn(i32, i32, i32)){
|
pub extern "C" fn test_func_issue_39_variation1(_f: extern "C" fn(i32, i32, i32)) {}
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn nonnull_parameter(_output_word_uuid: NonNull<[u8; 16]>){
|
pub extern "C" fn nonnull_parameter(_output_word_uuid: NonNull<[u8; 16]>) {}
|
||||||
}
|
|
||||||
|
|
||||||
// #[no_mangle]
|
// #[no_mangle]
|
||||||
// pub extern "C" fn non_nonnull_parameter(_output_word_uuid: [u8; 16]){
|
// pub extern "C" fn non_nonnull_parameter(_output_word_uuid: [u8; 16]){
|
||||||
// }
|
// }
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn non_nonnull_parameter2(_output_word_uuid: NonNull<u8>){
|
pub extern "C" fn non_nonnull_parameter2(_output_word_uuid: NonNull<u8>) {}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn nonzero_test(_a: NonZeroI8){
|
pub extern "C" fn nonzero_test(_a: NonZeroI8, _b: NonZeroU8, _c: NonZeroU32) {}
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn ge(_f: extern "C" fn(i32, i32, i32)){
|
pub extern "C" fn ge(_f: extern "C" fn(i32, i32, i32)) {}
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn nest_test(
|
pub extern "C" fn nest_test(
|
||||||
|
@ -217,23 +217,6 @@ impl RustType {
|
|||||||
fn convert_type_name(type_name: &str) -> String {
|
fn convert_type_name(type_name: &str) -> String {
|
||||||
let temp_string: String;
|
let temp_string: String;
|
||||||
let name = match type_name {
|
let name = match type_name {
|
||||||
// std::os::raw https://doc.rust-lang.org/std/os/raw/index.html
|
|
||||||
// std::ffi::raw https://doc.rust-lang.org/core/ffi/index.html
|
|
||||||
"c_char" => "byte",
|
|
||||||
"c_schar" => "sbyte",
|
|
||||||
"c_uchar" => "byte",
|
|
||||||
"c_short" => "short",
|
|
||||||
"c_ushort" => "ushort",
|
|
||||||
"c_int" => "int",
|
|
||||||
"c_uint" => "uint",
|
|
||||||
"c_long" => "CLong", // .NET 6
|
|
||||||
"c_ulong" => "CULong", // .NET 6
|
|
||||||
"c_longlong" => "long",
|
|
||||||
"c_ulonglong" => "ulong",
|
|
||||||
"c_float" => "float",
|
|
||||||
"c_double" => "double",
|
|
||||||
"c_void" => "void",
|
|
||||||
"CString" => "sbyte",
|
|
||||||
// rust primitives
|
// rust primitives
|
||||||
"i8" => "sbyte",
|
"i8" => "sbyte",
|
||||||
"i16" => "short",
|
"i16" => "short",
|
||||||
@ -252,6 +235,36 @@ impl RustType {
|
|||||||
"char" => "uint",
|
"char" => "uint",
|
||||||
"usize" => "nuint", // C# 9.0
|
"usize" => "nuint", // C# 9.0
|
||||||
"()" => "void",
|
"()" => "void",
|
||||||
|
// std::os::raw https://doc.rust-lang.org/std/os/raw/index.html
|
||||||
|
// std::ffi::raw https://doc.rust-lang.org/core/ffi/index.html
|
||||||
|
"c_char" => "byte",
|
||||||
|
"c_schar" => "sbyte",
|
||||||
|
"c_uchar" => "byte",
|
||||||
|
"c_short" => "short",
|
||||||
|
"c_ushort" => "ushort",
|
||||||
|
"c_int" => "int",
|
||||||
|
"c_uint" => "uint",
|
||||||
|
"c_long" => "CLong", // .NET 6
|
||||||
|
"c_ulong" => "CULong", // .NET 6
|
||||||
|
"c_longlong" => "long",
|
||||||
|
"c_ulonglong" => "ulong",
|
||||||
|
"c_float" => "float",
|
||||||
|
"c_double" => "double",
|
||||||
|
"c_void" => "void",
|
||||||
|
"CString" => "sbyte",
|
||||||
|
// std::num https://doc.rust-lang.org/std/num/index.html
|
||||||
|
"NonZeroI8" => "sbyte",
|
||||||
|
"NonZeroI16" => "short",
|
||||||
|
"NonZeroI32" => "int",
|
||||||
|
"NonZeroI64" => "long",
|
||||||
|
"NonZeroI128" => "Int128",
|
||||||
|
"NonZeroIsize" => "nint",
|
||||||
|
"NonZeroU8" => "byte",
|
||||||
|
"NonZeroU16" => "ushort",
|
||||||
|
"NonZeroU32" => "uint",
|
||||||
|
"NonZeroU64" => "ulong",
|
||||||
|
"NonZeroU128" => "UInt128",
|
||||||
|
"NonZeroUsize" => "nuint",
|
||||||
_ => {
|
_ => {
|
||||||
temp_string = escape_name(type_name);
|
temp_string = escape_name(type_name);
|
||||||
temp_string.as_str()
|
temp_string.as_str()
|
||||||
|
2
dotnet-sandbox/NativeMethods.cs
vendored
2
dotnet-sandbox/NativeMethods.cs
vendored
@ -59,7 +59,7 @@ namespace CsBindgen
|
|||||||
public static extern void non_nonnull_parameter2(byte* _output_word_uuid);
|
public static extern void non_nonnull_parameter2(byte* _output_word_uuid);
|
||||||
|
|
||||||
[DllImport(__DllName, EntryPoint = "nonzero_test", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
[DllImport(__DllName, EntryPoint = "nonzero_test", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
||||||
public static extern void nonzero_test(NonZeroI8 _a, U32Transparent _b);
|
public static extern void nonzero_test(sbyte _a, byte _b, uint _c);
|
||||||
|
|
||||||
[DllImport(__DllName, EntryPoint = "ge", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
[DllImport(__DllName, EntryPoint = "ge", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
|
||||||
public static extern void ge(delegate* unmanaged[Cdecl]<int, int, int, void> _f);
|
public static extern void ge(delegate* unmanaged[Cdecl]<int, int, int, void> _f);
|
||||||
|
Loading…
Reference in New Issue
Block a user