19 декабря 2017 г.

Runtime ошибка при работе с файлом ресурсов "Не удалось найти ресурсы..."

Список ошибок манифеста MissingManifestResourceException:
  • [Russian] Не удалось найти ресурсы, соответствующие указанной культуре или нейтральной культуре. Проверьте правильность внедрения или связывания *.resources со сборкой AssemblyName во время компиляции, или убедитесь, что все необходимые сопутствующие сборки полностью подписаны и могут быть загружены.
  • [English] Could not find any resources appropriate for the specified culture or the neutral culture.  Make sure *.resources was correctly embedded or linked into assembly AssemblyName at compile time, or that all the satellite assemblies required are loadable and fully signed.

18 декабря 2017 г.

Удаленный рабочий стол (RDP). WPF (MVVM).

Скачать исходный код можно по ссылке:

https://bitbucket.org/sergey_vaulin/remotedesktopterminalservice/src


Если у вас когда либо вставал вопрос о том, как реализовать в вашем приложении демонстрацию удаленного рабочего стола другого клиента, то скорее всего вам известны описанные ниже варианта:
  1. Делать скриншот на одной стороне, затем пересылать на сторону получателя и отображать на форме.
  2. Найти C# обёртки и реализации работы с VNC протоколом, который используется в opensource проекте UltraVNC
  3. Использование Windows Desktop Sharing в вашем приложении.
Сразу оговорюсь, что тут рассматривается схема, при которой запуск и остановку серверной части и демонстрация на другой стороне, осуществляется в прикладном коде нашего приложения.

(Пункт 1)
Использование скриншотов является самой простой в реализации, но достаточно трудоемкой операцией. Найденные примеры захвата снимка экрана и его обработка будет намного "тяжелее", чем используя обычный терминал удаленного рабочего стола. Попробуйте в Realtime поделать хотя бы 10 скриншотов и заметите, что ваше приложение будет активно отбирать ресурсы CPU. Да, сейчас компьютеры достаточно мощные и ваш компьютер может это не чувствовать, но клиенты могу сидеть и на Athlon II, имея загрузку в 30% процессорного времени, что неприемлемо. Выходом может стать нарезка скриншотов используя видео захват с дисплея через DirectX, но решения для copy+paste у меня нет.

(Пункт 2)
UltraVNC достаточно известное кросс платформенное приложение для демонстрации и управлением экраном. Находил обертки для .NET, поэтому, если все плохо, то можно посмотреть в эту сторону. Как мне известно, принцип работы VNC основан на захвате скриншотов клиента, и для того, что бы производить видео захват с дисплея, они используют свой драйвер, аккуратно подгружаемый при демонстрации. При этом сам драйвер идёт как отдельный устанавливаемый пакет и может быть скачан отдельно (искать UltraVNC Driver).

(Пункт 3)
Ну и наконец самый, но мой взгляд, простой способ реализовать демонстрацию удаленного экрана это использование нативного API под названием Windows Desktop Sharing (RDP). Используется стандартный механизм терминала удаленного рабочего стола, но в отличии от обычного подключения, удаленный компьютер не блокируется, как при терминале, и вы можете как в Teamviewer пользоваться одной мышкой и видеть экран одновременно. Далее я перечислю возможности, доступные при работе с Windows Desktop Sharing в формате плюсы и минусы:

Плюсы:
  • Демонстрацию удаленного экрана пользователя.
  • Подключение больше одного человека (код примера надо немного доработать).
  • Можно настраивать уровень взаимодействия для каждого подключающегося человека. Допустим одному дать полный доступ к управление, другому только для просмотра. За это отвечает CTRL_LEVEL выбор уровня. 
  • Мы можем в любой момент отключить пользователя, или приостановить показ.
  • Самой интересной особенностью считаю возможность "Фильтрации списка окон". Таким образом мы можем дать возможность видеть только то, что мы хотим показать, скрывая остальные окна.
  • Можно обеспечивать как прямое подключение клиента к серверу, так и сервера к клиенту. Тем самым можно решить проблему с NAT, инициируя подключение с другой стороны подсети.
  • Для авторизации можно использовать схему с логином и паролем.
  • Отображение идёт через ActiveX оснастку, которую можно разместить как на WPF, так и на WinForm.
  • Проекты можно без потери функциональности конвертировать под работы с .NET Framework 3.5.
Минусы:
  • Поддержка идет только начиная с Windows Vista.