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 中不起作用