EXTERN访问修饰符不工作(extern access modifiers don't w

2019-09-18 13:45发布

我试图隐藏我的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被忽略-这实在是烦人的,因为我想隐藏的所有这些功能相关的笨重的结构和枚举。

我想我可以把一切都在一个私人模块,所以它不是太大的交易,但我失去的东西吗?

Answer 1:

这将做的工作。

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类;
  • 你不能设置你的私有 外部方法,因为它不会是从模块的其余部分进入a ;
  • 一类的extern成员始终是私有的 ,所以有与相同签名的另一种方法;
  • 最后,使用EntryPoint来解决命名。


文章来源: extern access modifiers don't work