4

我试图隐藏我的 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被忽略了——这真的很烦人,因为我想隐藏与这些函数相关的所有笨拙的结构和枚举。

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

4

1 回答 1

0

这将完成这项工作。

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 *) )

笔记:

  • 私有类只能从封闭模块访问,这是您需要的,因此只需将方法包装在一个NativeMethods类中;
  • 您不能将extern方法设置为私有,因为它不能从模块的其余部分访问a
  • 类的extern成员始终是private,因此还有另一个具有相同签名的方法;
  • 最后,用于EntryPoint解析命名。
于 2012-07-03T23:00:01.910 回答