2012-06-26 3 views
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 игнорируется - что действительно раздражает, потому что я хотите скрыть все неудобные структуры и перечисления, связанные с этими функциями.

Я думаю, я мог бы разместить все в частном модуле, так что это не слишком большая сделка, но я чего-то не хватает?

+1

Пахнет как ошибка; помещая их в частный модуль, действительно звучит как лучший обходной путь. – 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

Я просто помещал вызовы extern в частный вложенный модуль, а обертки - в публичный модуль, поддерживающий его. –

Смежные вопросы