extern访问修饰符不起作用

时间:2012-06-26 21:58:48

标签: f# pinvoke access-modifiers

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

我想我可以把所有东西放在一个私人模块中,所以这不是太大的交易,但我错过了什么?

1 个答案:

答案 0 :(得分: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 类的成员始终是私有,因此还有另一种具有相同签名的方法;
  • 最后,使用EntryPoint来解析命名。