4

次のように、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は無視されます。これらの関数に関連付けられている扱いにくい構造体と列挙型をすべて非表示にしたいので、これは本当に厄介です。

すべてをプライベートモジュールに入れることができると思うので、それほど大したことではありませんが、何かが足りないのでしょうか?

4

1 に答える 1

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メソッドをprivateに設定することはできませんa
  • クラスのexternメンバーは常にprivateであるため、同じ署名を持つ別のメソッドがあります。
  • 最後に、EntryPointネーミングの解決に使用します。
于 2012-07-03T23:00:01.910 に答える