我在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参数。
答案 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;直到您的本机库不再需要函数回调。