平台调用F#回调函数

平台调用F#回调函数,f#,mono,pinvoke,raspberry-pi2,F#,Mono,Pinvoke,Raspberry Pi2,我在覆盆子皮2上使用F#(臂7和单声道)。我目前正在尝试使用用C编写的WiringPi库。我已经成功地使用了一些使用P/Invoke的函数 现在我试图使用中断(请参阅),但我被这个带有以下C签名的函数难住了 int wiringPiISR (int pin, int edgeType, void (*function)(void)); 丹尼尔·里奇斯(Daniel Riches)将其翻译成了这样一个C#library //This is the C# equivelant to "void

我在覆盆子皮2上使用F#(臂7和单声道)。我目前正在尝试使用用C编写的WiringPi库。我已经成功地使用了一些使用P/Invoke的函数

现在我试图使用中断(请参阅),但我被这个带有以下C签名的函数难住了

int wiringPiISR (int pin, int edgeType,  void (*function)(void));
丹尼尔·里奇斯(Daniel Riches)将其翻译成了这样一个C#library

//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#中)

[]
外部int接线PIISR(int引脚、int模式、ISR回调);
ISRCallback的类型定义是什么样的


注意:这不仅仅是一个“a”函数指针,而是一个带有void参数的void指针。

委托定义如下所示:

type ISRCallback = delegate of unit -> unit
[<DllImport("libwiringPi.so", EntryPoint = "wiringPiISR")>] 
extern int wiringPiISR(int pin, int mode, [<MarshalAs(UnmanagedType.FunctionPtr)>]ISRCallback callBack);
平台调用签名如下所示:

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

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

可能的重复肯定与该问题有关,但没有完全回答它。