我有一个 C# extern 声明,如下所示:
[DllImport("something.dll")]
public static extern ReturnCode GetParent(IntPtr inRef, out IntPtr outParentRef);
如何将其翻译为 F#?
我有一个 C# extern 声明,如下所示:
[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# 语法的属性,用于使用 MarshalAs 的 P/Invoke 签名
对于其他尝试通过 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);