43 lines
1.1 KiB
C#
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();
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|