我正在处理来自 F# 的平台调用,并且收到一个编译器错误,我真的无法理解。首先,让我展示一下我正在做的事情的 C 签名:
int Foo(
ULONG_PTR *phHandle,
DWORD flags
);
在 F# 中,我认为本地调用它的正确方法如下:
[<DllImport("somedll.dll")>]
static extern int APlatformInvokeCall
(
[<Out>]nativeint& phHandle,
uint32 flags
)
如果我尝试调用这个在课堂上,像这样调用它时出现编译错误:
type Class1() =
[<DllImport("somedll.dll")>]
static extern int APlatformInvokeCall
(
nativeint& phHandle,
uint32 flags
)
member this.Foo() =
let mutable thing = nativeint 0
APlatformInvokeCall(&thing, 0u) |> ignore
thing
错误是:
类型实例化涉及 byref 类型。 Common IL 规则不允许这样做。
奇怪的是,当我在模块中完成这一切时,编译错误就消失了:
module Module1 =
[<DllImport("somedll.dll")>]
extern int APlatformInvokeCall
(
nativeint& phHandle,
uint32 flags
)
let Foo() =
let mutable thing = nativeint 0
APlatformInvokeCall(&thing, 0u) |> ignore
thing
为什么它编译为模块,而不是类?