2015-01-20 5 views
1

При использовании System.Net.Sockets.Socket с моно на Linux предположительно моно в конечном итоге будет использовать сокет BSD (а в Windows - Winsock).Как использовать монофонические разъемы BSD?

Глядя на источник моно для скажем Socket.Bind() это делает внешний вызов:

// Creates a new system socket, returning the handle 
[MethodImplAttribute(MethodImplOptions.InternalCall)] 
private extern static void Bind_internal(IntPtr sock, 
        SocketAddress sa, 
        out int error); 

Который говорит мне моно должны быть ссылающийся на родную библиотеку, которая выставляет такой метод подписи и родной библиотеки будет принимать заботу о кросс-платформенная реализация (поскольку в BSD или Winsock нет функции с именем Bind_internal).

Итак, мой вопрос теперь становится тем, какую родную библиотеку использовать моно?

ответ

3

Вы немного недопонимания, какие

[MethodImplAttribute(MethodImplOptions.InternalCall)] 

означает, что реализация этого метода заключается в рамках реализации Mono, а не в сборке, время выполнения нагрузки. Он вполне может вызвать функцию ОС (для сокетов это, безусловно, будет: зачем переопределять службу ОС).

Но он не должен вызвать службу OS, рассмотрим это с .NET Reference Source в реализации System.String:

public extern int Length { 
    [System.Security.SecuritySafeCritical] // auto-generated 
    [ResourceExposure(ResourceScope.None)] 
    [MethodImplAttribute(MethodImplOptions.InternalCall)] 
    get; 
} 

String.Length встроен непосредственно в CLR, а не в OS API.

Реферат: InternalCall означает внутренне выполненное внутри среды выполнения. Эта реализация может вызвать метод ОС, или это может быть не так: вы не можете сказать с этого уровня.

Чтобы ответить на ваш вопрос: я ожидаю, что Моно Bind_internal будет в конечном счете называют bind(2), но с некоторым обертыванием (в .NET Socket имеет больше состояния и логику, чем дескриптор файла * NIX, которые используют API для ОС).

+0

Чтобы быть более точным: https://github.com/mono/mono/blob/6f802b490ca568330cd5f32c319609899ba81c8e/mono/metadata/icall-def.h#L450, который соответствует https://github.com/mono/mono/ blob/6202a690ad14694ed74cdc990215e7dc2944da18/mono/metadata/socket-io.C# L1142 и найдите #if BSD. –

+0

Я полностью пропустил, что такое MethodImplAttribute и делает, спасибо. – markmnl

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