Подтвердить что ты не робот

Библиотека .NET Portable Class и поддержка UDP

Я пишу библиотеку С# для Philips Hue Lights. Я пытаюсь написать базовые API-оболочки в переносном наборе .NET таким образом, что я могу повторно использовать эту библиотеку для различных платформ, таких как Windows 8/RT/WP. Сам API по всему HTTP-протоколу использует REST, поэтому HttpWebRequest будет удовлетворять большинство моих потребностей.

Сетевой мост, который управляет самими огнями, может быть обнаружен с помощью SSDP через UDP. Тем не менее, я не могу найти способ использовать UDP-сокеты в переносимой библиотеке классов (PCL).

Нет System.Net.Sockets. В пространстве имен System.Net нет ничего, что позволило бы это сделать. Я видел DatagramSocket, указанный в Windows.Networking.Sockets, но не могу видеть это пространство имен в Intellisense.

Кто-нибудь знает, как я могу получить UDP-функции для SSDP в .NET PCL?

Я действительно не хочу отделять функциональность обнаружения от основной библиотеки.

Сейчас я нацеливаюсь на .NET 4.5 + SL 5 + WP 8 + .NET for Windows Store. У меня создалось впечатление, что сокеты еще доступны.

4b9b3361

Ответ 1

Не существует общего пересечения для поддержки сокетов между приложениями WinRT и WPF, и поэтому он недоступен в проектах PCL, нацеленных на них.

У меня есть библиотека PCL, ориентированная на WPF и WinRT, которая взаимодействует с сетью обнаружения UDP, а самая чистая реализация, с которой я пришел, включала создание интерфейса IUDPSocket в библиотеке PCL, которая определяет членов для отправки/приема данных и подключения к группам многоадресной рассылки, Приложение WPF реализует мой IUDPSocket с помощью System.Net.Sockets.Socket, а приложение RT реализует это с помощью пакета Windows.Networking.Sockets.DatagramSocket.

Конструктор моего клиентского класса сетевого обнаружения (определенный в проекте PCL) принимает делегат, который используется для создания экземпляра IUDPSocket. Я делаю это вместо того, чтобы передавать инициализированный экземпляр IUDPSocket, поэтому вызывающий код не должен знать, какие порты или адреса задействованы.

Ответ 2

Как описано в этой статье MSDN, PCL ограничивается общими сборками для целевых платформ:

В проекте Portable Class Library вы указываете платформы, на которые хотите настроить таргетинг, и только поддерживаемые сборки для этих платформ ссылаются в вашем проекте. Если вы попытаетесь ссылаться на сборку, которая не поддерживается для платформ, на которые вы нацелились, Visual Studio предупреждает вас о несовместимости. Основные сборки (mscorlib.dll, System.dll, System.Core.dll и System.Xml.dll) поддерживаются на всех платформах.

Как указано в сводной таблице той же статьи, Network Class Library (NCL) поддерживается для каждой платформы, но XBox 360. Дальнейшее чтение приводит к следующей информации:

Когда вы указываете платформы, на которые вы хотите настроить таргетинг в проекте Portable Class Library, поддерживаемые сборки для этих платформ автоматически ссылаются на ваш проект. Вам не нужно добавлять или удалять сборки. Связанные сборки автоматически обновляются, если вы изменяете целевые платформы.

Итак, возможно, вы выбрали каждую платформу во время создания проекта. Отключение XBox 360 должно вернуть вам поддержку NCL и UdpClient. Однако, если вам нужна поддержка также для Xbox 360, у вас есть два варианта: выбор типа проекта, который не является PCL или вручную реализует поддержку UDP.