extern 访问修饰符不起作用

Posted

技术标签:

【中文标题】extern 访问修饰符不起作用【英文标题】:extern access modifiers don't work 【发布时间】:2012-06-28 07:33:43 【问题描述】:

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

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

【问题讨论】:

闻起来像虫子;将这些放在私有模块中确实听起来是最好的解决方法。 不管怎样,这听起来像是接口文件的绝佳用例(换句话说,使用 *.fsi 文件隐藏某些元素)。 你的extern函数现在在什么情况下?在一个班级内,还是? @pblasucci 拜托,这不是“用例”。他们并没有在某些场景中破坏访问修饰符关键字,只是为了给另一个功能赋予目的。请原谅我的语气,但当人们在他们最喜欢的语言出现问题时拒绝接受时,我不禁感到愤怒。这对语言的未来不利。 @ReiMiyasaka:哇!慢慢来。我没有说它是或不是一个错误。我不能打那个电话。我只是建议了一种解决您问题的方法。这不是 *** 的重点吗? 【参考方案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 *) )

注意事项:

private 类只能从封闭模块访问,这是您所需要的,所以只需将方法包装在 NativeMethods 类中即可; 你不能设置你的extern方法private,因为它不能从模块a的其余部分访问; extern 类的成员始终是private,因此还有另一个具有相同签名的方法; 最后,使用EntryPoint 解析命名。

【讨论】:

我只是将外部调用放在私有嵌套模块中,并将包装函数放在包含它的公共模块中。

以上是关于extern 访问修饰符不起作用的主要内容,如果未能解决你的问题,请参考以下文章

isPlaceholder 修饰符不可用且在小部件工具包 + SwiftUI 中不起作用

当使用vue的按键修饰符不起效果的时候怎么办?如@keyup.enter = '' ;

可测试辅助方法的访问修饰符是啥?

方法有那些访问控制修饰符,分别是啥作用

什么是修饰符?它有什么作用?举例说明

JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?