gpt4 book ai didi

f# - extern 访问修饰符不起作用

转载 作者:行者123 更新时间:2023-12-04 22:49:53 25 4
gpt4 key购买 nike

我试图隐藏我的 P/Invoke 函数,比如这个:

[<DllImport("kernel32.dll", SetLastError=true)>]
extern bool private CreateTimerQueueTimer(IntPtr& phNewTimer, nativeint TimerQueue, WaitOrTimerDelegate Callback, nativeint Parameter, uint32 DueTime, uint32 Period, ExecuteFlags Flags)

然而奇怪的是, private被忽略——这真的很烦人,因为我想隐藏与这些函数相关的所有笨拙的结构和枚举。

我想我可以把所有东西都放在一个私有(private)模块中,所以这没什么大不了的,但我错过了什么吗?

最佳答案

这将完成这项工作。

module a =
[<AbstractClass>]
type private NativeMethods() =
[<DllImport("kernel32.dll", EntryPoint="CreateTimerQueueTimer",
SetLastError=true)>]
static extern bool sCreateTimerQueueTimer( (* whatever *) )
static member CreateTimerQueueTimer = sCreateTimerQueueTimer

let usedInside = NativeMethods.CreateTimerQueueTimer

module b =
open a
// the next line fails to compile
let usedOutside = NativeMethods.CreateTimerQueueTimer( (* whatever *) )

笔记:
  • 私有(private)类只能从封闭模块访问,这是您需要的,所以只需将方法包装在 NativeMethods 中类(class);
  • 您不能将外部方法设置为私有(private),因为无法从模块的其余部分访问它 a ;
  • 类的 extern 成员始终是私有(private)的,因此还有另一个具有相同签名的方法;
  • 最后,使用 EntryPoint解决命名问题。
  • 关于f# - extern 访问修饰符不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216552/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com