2011-07-02 10 views

ответ

12

Вы можете попробовать что-то вроде кода ниже. Я не знаю, что такое 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? Если да, то мы могли бы попытаться запустить решение перед отправкой ответа ...

+0

, который отлично работает! Однако - старая декларация C# позволила мне сделать «let (n, v) = GetParent input». Любой способ изменить код, чтобы разрешить этот синтаксис? –

+0

oh, и ReturnCode - это просто перечисление, основанное на uint32 –

+0

Кажется, связано с декоратором «hidebysig» в CIL. В рефлекторе красных ворот используется метод C#, тогда как метод F # этого не делает. Предлагает ли F # hidebysig? (Я все еще пытаюсь понять, что это означает). –

1

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

+0

Неа, не работает –

+0

К не работает, значит, он не компилируется? –

+0

Да. По крайней мере, я это интерпретировал. –

0

Для тех, кто еще пытается использовать 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);