mirror of
https://github.com/Sarsoo/csbindgen.git
synced 2024-12-23 06:56:27 +00:00
struct bool emit MarshalAs
This commit is contained in:
parent
4dba240d2b
commit
dabad3323a
31
csbindgen-tests/src/lib.rs
vendored
31
csbindgen-tests/src/lib.rs
vendored
@ -1,5 +1,3 @@
|
|||||||
use std::io::Bytes;
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
@ -34,15 +32,15 @@ pub extern "C" fn my_bool(
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
// #[no_mangle]
|
||||||
pub unsafe extern "C" fn new(x: *mut *mut Vec<u8>) {
|
// pub unsafe extern "C" fn new(x: *mut *mut Vec<u8>) {
|
||||||
let v = Box::new(Vec::new());
|
// let v = Box::new(Vec::new());
|
||||||
*x = Box::into_raw(v);
|
// *x = Box::into_raw(v);
|
||||||
}
|
// }
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn unsafe_return_string() -> *const u8 {
|
pub unsafe extern "C" fn unsafe_return_string() -> *const u8 {
|
||||||
todo!();
|
todo!();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -55,6 +53,23 @@ pub extern "C" fn unsafe_destroy_string(s: *mut String) {
|
|||||||
unsafe { Box::from_raw(s) };
|
unsafe { Box::from_raw(s) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn create_context() -> *mut Context {
|
||||||
|
let ctx = Box::new(Context { foo: true });
|
||||||
|
Box::into_raw(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn delete_context(context: *mut Context) {
|
||||||
|
unsafe { Box::from_raw(context) };
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct Context {
|
||||||
|
pub foo: bool,
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn build_test() {
|
fn build_test() {
|
||||||
// let path = std::env::current_dir().unwrap();
|
// let path = std::env::current_dir().unwrap();
|
||||||
|
@ -154,20 +154,22 @@ pub fn emit_csharp(
|
|||||||
|
|
||||||
structs_string
|
structs_string
|
||||||
.push_str_ln(format!(" [StructLayout(LayoutKind.{layout_kind})]").as_str());
|
.push_str_ln(format!(" [StructLayout(LayoutKind.{layout_kind})]").as_str());
|
||||||
structs_string.push_str_ln(format!(" public unsafe struct {name}").as_str());
|
structs_string.push_str_ln(format!(" {accessibility} unsafe struct {name}").as_str());
|
||||||
structs_string.push_str_ln(" {");
|
structs_string.push_str_ln(" {");
|
||||||
for field in &item.fields {
|
for field in &item.fields {
|
||||||
if item.is_union {
|
if item.is_union {
|
||||||
structs_string.push_str_ln(" [FieldOffset(0)]");
|
structs_string.push_str_ln(" [FieldOffset(0)]");
|
||||||
}
|
}
|
||||||
structs_string.push_str(
|
|
||||||
format!(
|
let type_name = field.rust_type.to_csharp_string(options, aliases);
|
||||||
" public {} {}",
|
let attr = if type_name == "bool" {
|
||||||
field.rust_type.to_csharp_string(options, aliases),
|
"[MarshalAs(UnmanagedType.U1)] ".to_string()
|
||||||
field.name
|
} else {
|
||||||
)
|
"".to_string()
|
||||||
.as_str(),
|
};
|
||||||
);
|
|
||||||
|
structs_string
|
||||||
|
.push_str(format!(" {}public {} {}", attr, type_name, field.name).as_str());
|
||||||
if field.rust_type.is_fixed_array {
|
if field.rust_type.is_fixed_array {
|
||||||
let mut digits = field.rust_type.fixed_array_digits.clone();
|
let mut digits = field.rust_type.fixed_array_digits.clone();
|
||||||
if digits == "0" {
|
if digits == "0" {
|
||||||
|
12
dotnet-sandbox/method_call.cs
vendored
12
dotnet-sandbox/method_call.cs
vendored
@ -27,7 +27,19 @@ namespace CsBindgen
|
|||||||
[DllImport(__DllName, EntryPoint = "unsafe_destroy_string", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport(__DllName, EntryPoint = "unsafe_destroy_string", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void unsafe_destroy_string(String* s);
|
public static extern void unsafe_destroy_string(String* s);
|
||||||
|
|
||||||
|
[DllImport(__DllName, EntryPoint = "create_context", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Context* create_context();
|
||||||
|
|
||||||
|
[DllImport(__DllName, EntryPoint = "delete_context", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void delete_context(Context* context);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
internal unsafe struct Context
|
||||||
|
{
|
||||||
|
[MarshalAs(UnmanagedType.U1)] public bool foo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user