Как преобразовать внешние / ref внешние параметры в F # - PullRequest
7 голосов
/ 02 июля 2011

У меня есть объявление C # extern, которое выглядит так:

    [DllImport("something.dll")]
    public static extern ReturnCode GetParent(IntPtr inRef, out IntPtr outParentRef);

Как перевести это на F #?

Ответы [ 3 ]

12 голосов
/ 02 июля 2011

Вы можете попробовать что-то вроде кода ниже. Я не знаю, что такое ReturnCode, поэтому код ниже ожидает, что это целое число. Для любого более сложного типа вам нужно использовать атрибут [<Struct>], как в ответе, на который ссылается A-Dubb.

type ReturnCode = int

[<System.Runtime.InteropServices.DllImport("something.dll")>]
extern ReturnCode GetParent(System.IntPtr inRef, System.IntPtr& outParentRef);

Чтобы вызвать функцию, вы должны написать что-то вроде этого:

let mutable v = nativeint 10
let n = GetParent(nativeint 0, &v)

Кстати: не могли бы вы также опубликовать пример кода C, который реализует функцию в something.dll? Если да, мы можем попробовать запустить решение перед отправкой ответа ...

1 голос
/ 03 мая 2014

Для всех, кто пытается использовать F # с EnvDte через PInvoke, это может помочь:

[<System.Runtime.InteropServices.DllImport("ole32.dll")>] 
extern unit CreateBindCtx(System.IntPtr inRef, IBindCtx& outParentRef);
[<System.Runtime.InteropServices.DllImport("ole32.dll")>]
extern unit GetRunningObjectTable(System.IntPtr inRef, IRunningObjectTable& outParentRef);

, что, по-видимому, немного неверно, но, похоже, работает.определение должно быть:

[<System.Runtime.InteropServices.DllImport("ole32.dll")>] 
extern int CreateBindCtx(System.IntPtr inRef, IBindCtx& outParentRef);
[<System.Runtime.InteropServices.DllImport("ole32.dll")>]
extern int GetRunningObjectTable(System.IntPtr inRef, IRunningObjectTable& outParentRef);
1 голос
/ 02 июля 2011

Может быть, этот похожий вопрос укажет вам правильное направление.Похоже, он использовал атрибуты на уровне параметров для «in» и «out» F # синтаксиса для подписи P / Invoke с использованием MarshalAs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...