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 ReceiveAsync() { return Task.Run(() => { Console.WriteLine("Receiving.."); var ptr = receive(); //blocking call Console.WriteLine("Received!"); return ptr.ToByteArray(); }); } } }