我试图隐藏我的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
被忽略-这实在是烦人的,因为我想隐藏的所有这些功能相关的笨重的结构和枚举。
我想我可以把一切都在一个私人模块,所以它不是太大的交易,但我失去的东西吗?
这将做的工作。
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
来解决命名。