7

我有一个 C# extern 声明,如下所示:

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

如何将其翻译为 F#?

4

3 回答 3

13

您可以尝试类似下面的代码。我不知道是什么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吗?如果是,我们可以在发送答案之前尝试运行解决方案...

于 2011-07-02T18:55:54.080 回答
1

也许这个类似的问题会为您指明正确的方向。看起来他在参数级别使用了“in”和“out” F# 语法的属性,用于使用 MarshalAs 的 P/Invoke 签名

于 2011-07-02T18:42:47.727 回答
1

对于其他尝试通过 PInvoke 将 F# 与 EnvDte 一起使用的人,这可能会有所帮助:

[<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);
于 2014-05-02T20:15:54.153 回答