目前,我正在学习将Rust FFI与C一起使用,而我目前的一个问题是如何处理一组structItem[]
我试图实现的是C# => Rust => C#我已经能够使数组生锈并对数据执行一些操作。我一直纠结的是把一个排序数组从Rust返回到C。
所以我假设我可以用指针直接从C#in Rust修改内存。然而,尽管能够从ptr中分割数据,然后在Rust中对数组进行排序,结果并没有传播回C范围。
我也尝试过将数组返回到C#一个返回值,但我目前对从Rust back到C#的指针的使用知识不足,而且我认为它稍微复杂一些,因为它是指向结构数组的指针。
这里有一个更直接的例子的要点。
https://gist.github.com/Ostoyae/4511448776a4e54c0b4077883e761f11
图书馆

#[repr(C)]
#[derive(Eq, PartialEq)]
pub struct Item {
    id: *const c_char,
    name: *const c_char,
    variation: u32,
    category: u32,
    quality: u32,
}

#[no_mangle]
pub extern "C" fn ffi_sort_inventory(length: u32, array_ptr: *mut Item) {
    let items: &mut [Item] = unsafe {
        assert!(!array_ptr.is_null());
        std::slice::from_raw_parts_mut(array_ptr, length as usize)
    };
        // some sorting to items //
}


铁锈

[StructLayout(LayoutKind.Sequential)]
    public struct Item
    {
        public string id;
        public string name;
        public uint variation;
        public uint category;
        public uint quality;
    }

public class Inventory {
        private Item[] items;

        [DllImport("stuff")]
        [System.Security.SecurityCritical]
        private static extern void ffi_sort_inventory(uint length, Item[] items);

        public void sort_inventory()
        {
            ffi_sort_inventory((uint) Items.Length, this.items);

            WriteLine(items);
        }
    }
}


我希望最好的例子是通过使用指针而不是返回新分配的内存来修改已经存在于内存中的数组。但我也希望看到这两种解决方案。
谢谢。

最佳答案

尝试以下操作:

    [StructLayout(LayoutKind.Sequential)]
    public struct Item
    {
        [MarshalAs(UnmanagedType.AnsiBStr)]
        public string id;
        [MarshalAs(UnmanagedType.AnsiBStr)]
        public string name;
        public uint variation;
        public uint category;
        public uint quality;
    }

    public class Inventory {



        [DllImport("stuff")]
        [System.Security.SecurityCritical]
        private static extern void ffi_sort_inventory(uint length, IntPtr items);

        public void sort_inventory()
        {
             Item[] items = null;
             IntPtr itemsPtr =  IntPtr.Zero;
            Marshal.StructureToPtr(items, itemsPtr, true);
            ffi_sort_inventory((uint) items.Length, itemsPtr);

        }
    }

关于c# - 如何获得Rust FFI返回结构数组或更新内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57912335/

10-17 00:50