2015-12-01 2 views
4

Я использую F # на малине Pi 2 (ARM 7 &, таким образом, моно). В настоящее время я пытаюсь использовать библиотеку WiringPi, написанную на C. Мне удалось успешно использовать некоторые функции, используя P/Invoke.Функции вызова Invoke F #

Теперь я пытаюсь использовать прерывания (см http://wiringpi.com/reference/priority-interrupts-and-threads/), но я озадачен этой функцией со следующей С подписью

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

переведенной (см 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 выглядеть?

Примечание: это не только указатель функции «a», но и пустое, с аргументами пустоты.

+0

Возможный дубликат [Как передать делегат F # методу P/Invoke, ожидающему указателя функции?] (Http://stackoverflow.com/questions/5682927/how-can-i-pass-an-f -delegate-to-ap-invoke-method-expecting-a-function-pointer) – Sehnsucht

+1

Определенно связанный с этим вопросом, но не совсем ответил на него. –

ответ

4

Определение делегат будет выглядеть примерно так:

type ISRCallback = delegate of unit -> unit 

И платформа Invoke подпись будет выглядеть следующим образом:

[<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 подлежат сборке мусора. Разработчик должен обеспечить, чтобы делегат не «вышел из сферы действия», пока ваша родная библиотека больше не нуждается в обратном вызове функции.

Смежные вопросы