F# 在F中的模块中包装DLL导入#

F# 在F中的模块中包装DLL导入#,f#,dllimport,F#,Dllimport,我正试图从user32.dll为一些windows api函数创建一个“包装器”模块。我仍在学习F#,因此我对遗传和多态性在F#中的作用以及如何将其应用于这种情况感到相当模糊 我有这个模块: module MouseControl = [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>] extern void ShowCursor(bool show)

我正试图从
user32.dll
为一些windows api函数创建一个“包装器”模块。我仍在学习F#,因此我对遗传和多态性在F#中的作用以及如何将其应用于这种情况感到相当模糊

我有这个模块:

module MouseControl =         
    [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
    extern void ShowCursor(bool show)

    [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
    extern void internal mouse_event(int flags, int dX, int dY, int buttons, int extraInfo)
    let MouseEvent(flags, dX, dY, buttons, extraInfo) = mouse_event(flags, dX, dY, buttons, extraInfo)
模块MouseControl=
[]
外部无效显示光标(布尔显示)
[]
外部无效内部鼠标事件(int标志、int dX、int dY、int按钮、int extraInfo)
let MouseEvent(标志,dX,dY,按钮,extraInfo)=鼠标事件(标志,dX,dY,按钮,extraInfo)

我的目标是能够从使用此模块的其他代码中“隐藏”鼠标事件函数,而不是将该函数公开为鼠标事件。使用此代码,
mouse\u event
MouseEvent
当前可用于调用此模块的代码。如何将
鼠标事件
隐藏在模块专用的位置?

在代码示例中,您已经将
鼠标事件
函数标记为
内部
——因此原则上,您只需将其标记为
专用
。但是,F#编译器似乎忽略了
extern
成员上的可见性注释,因此最简单的选择是将它们放在嵌套模块中,并隐藏整个嵌套模块:

module MouseControl =         
  module private Imported = 
    [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
    extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo)

  let MouseEvent(flags, dX, dY, buttons, extraInfo) = 
    Imported.mouse_event(flags, dX, dY, buttons, extraInfo)
模块MouseControl=
模块专用导入=
[]
外部无效鼠标事件(int标志、int dX、int dY、int按钮、int extraInfo)
让鼠标事件(标志、dX、dY、按钮、extraInfo)=
已导入.mouse_事件(标志、dX、dY、按钮、extraInfo)

导入的模块
现在仅在
MouseControl
模块内可见。从外部,您无法访问MouseControl.Imported中的任何内容!顺便说一句:这与多态性或继承没有任何关系-所以我从你的问题中删除了标签。它只是关于使用可见性注释。。。