RustCSharpInterop/FfiChannels/Ffi.cs
2023-10-17 19:00:03 +02:00

43 lines
1.1 KiB
C#

using System.Runtime.InteropServices;
namespace FfiChannels
{
[StructLayout(LayoutKind.Sequential)]
public struct ByteArray
{
public IntPtr data;
public int length;
public byte[] ToByteArray() {
var array = new byte[length];
Marshal.Copy(data, array, 0, length);
return array;
}
}
public delegate void Callback(ByteArray byteArray);
public static class Bindings {
[DllImport("ffi_channels")]
public static extern void send(byte[] data, int length);
[DllImport("ffi_channels")]
public static extern ByteArray receive();
[DllImport("ffi_channels")]
public static extern void register_callback(Callback cb);
[DllImport("ffi_channels")]
public static extern void start_listening();
public static Task<byte[]> ReceiveAsync() {
return Task.Run(() => {
Console.WriteLine("Receiving..");
var ptr = receive(); //blocking call
Console.WriteLine("Received!");
return ptr.ToByteArray();
});
}
}
}