2012-06-26 61 views
4

我试图隐藏我的P/Invoke功能,像这样的:的extern访问修饰符不工作

[<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

闻起来像一个bug;将这些放在私有模块中确实听起来像是最好的解决方法。 – Brian

+3

对于它的价值来说,这听起来像是一个很好的界面文件用例(换句话说,使用* .fsi文件来隐藏某些元素)。 – pblasucci

+0

现在在什么情况下你的'extern'功能?在一堂课内,或? –

回答

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来解析命名。
+0

我只是把外部调用放在一个私有嵌套模块中,并且包装函数在保存它的公共模块中。 –