平台调用F#回调函数

时间:2015-12-01 20:58:28

标签: f# mono pinvoke raspberry-pi2

我在Raspberry Pi 2(ARM 7& mono mono)上使用F#。我目前正在尝试使用用C语言编写的WiringPi库。我已经成功地使用P / Invoke来使用一些函数。

现在我正在尝试使用中断(请参阅http://wiringpi.com/reference/priority-interrupts-and-threads/)但我被此函数难住,并带有以下C签名

int wiringPiISR (int pin, int edgeType,  void (*function)(void));

已将Daniel Riches翻译成(如果https://github.com/danriches/WiringPi.Net/blob/master/WiringPi/WrapperClass.cs)到这样的C#库中

//This is the C# equivelant to "void (*function)(void))" required by wiringPi to define a callback method 
public delegate void ISRCallback(); 

[DllImport("libwiringPi.so", EntryPoint = "wiringPiISR")] 
public static extern int wiringPiISR(int pin, int mode, ISRCallback method); 

我怎么在F#中这样做?我猜DllImport行看起来像这样("方法"在F#中保留)

[<DllImport("libwiringPi.so", EntryPoint = "wiringPiISR")>] 
  extern int wiringPiISR(int pin, int mode, ISRCallback callBack);

ISRCallback的类型定义是什么样的?

注意:这不仅仅是&#34; a&#34;函数指针,但是一个void,带有void参数。

1 个答案:

答案 0 :(得分:4)

委托定义如下所示:

type ISRCallback = delegate of unit -> unit

平台调用签名看起来像这样:

[<DllImport("libwiringPi.so", EntryPoint = "wiringPiISR")>] 
extern int wiringPiISR(int pin, int mode, [<MarshalAs(UnmanagedType.FunctionPtr)>]ISRCallback callBack);

该功能的一个示例用法:

let callback : ISRCallback = ISRCallback(fun () -> (*do something interesting here*) ())
let result = wiringPiISR(1, 1, callback)

您应该记住,.NET中的委托会受到垃圾回收。开发人员有责任确保代表不会超出范围&#34;直到您的本机库不再需要函数回调。