У меня есть C# Экстерн заявление, что идет как это:Как конвертировать из/исх параметры Экстерн для F #
[DllImport("something.dll")]
public static extern ReturnCode GetParent(IntPtr inRef, out IntPtr outParentRef);
Как перевести, что F #?
У меня есть C# Экстерн заявление, что идет как это:Как конвертировать из/исх параметры Экстерн для F #
[DllImport("something.dll")]
public static extern ReturnCode GetParent(IntPtr inRef, out IntPtr outParentRef);
Как перевести, что F #?
Вы можете попробовать что-то вроде кода ниже. Я не знаю, что такое 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
? Если да, то мы могли бы попытаться запустить решение перед отправкой ответа ...
Возможно, этот аналогичный вопрос укажет вам в правильном направлении. Похоже, он использовал атрибуты на уровне параметра для «in» и «out» F# syntax for P/Invoke signature using MarshalAs
Неа, не работает –
К не работает, значит, он не компилируется? –
Да. По крайней мере, я это интерпретировал. –
Для тех, кто еще пытается использовать 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);
, который отлично работает! Однако - старая декларация C# позволила мне сделать «let (n, v) = GetParent input». Любой способ изменить код, чтобы разрешить этот синтаксис? –
oh, и ReturnCode - это просто перечисление, основанное на uint32 –
Кажется, связано с декоратором «hidebysig» в CIL. В рефлекторе красных ворот используется метод C#, тогда как метод F # этого не делает. Предлагает ли F # hidebysig? (Я все еще пытаюсь понять, что это означает). –