В ситуации, когда у вас есть интерфейс пользовательского интерфейса, созданный с использованием нового стиля приложений Metro для Windows 8, и вы хотите, чтобы он взаимодействовал с приложением .NET, запущенным на рабочем столе на том же локальном компьютере (например, с приложением службы Windows).
Какие формы межпроцессного взаимодействия доступны между приложением метро и настольным приложением?
Спасибо Павлу Минаеву из команды Visual Studio, который предоставил некоторую исходную информацию здесь в комментарии, цитируемом:
По словам Мартина Ловелла, для этого нет никакого преднамеренного механизма, а некоторые из них намеренно ограничены. Например, нет ни именованных каналов, ни файлов с отображением памяти. Есть сокеты (включая сокеты сервера), но при подключении к localhost вы можете подключиться только к тому же приложению. Вы можете использовать обычные файлы в одной из общих «известных папок» (документы, изображения и т.д.), но это довольно грубый способ взлома, требующий опроса и видимый пользователю. - комментирует этот вопрос Павел Минаев.
Так что, потерпев неудачу с обычными подходами, я думал об использовании веб-сервисов или чтении / записи в базу данных, чтобы получить некоторую форму связи, и то и другое кажется излишним, когда процессы выполняются на одном компьютере.
Имеет ли смысл то, что я здесь пытаюсь сделать? Я вижу необходимость в том, чтобы приложение метро было интерфейсом интерфейса для существующей службы, работающей на рабочем столе. Или лучше просто использовать WPF для внешнего интерфейса, работающего на рабочем столе (т. Е. Не для городских приложений).
Ответы:
Я сейчас портирую свой существующий проект на Win8. Он состоит из службы Windows и приложения в трее, которые общаются друг с другом через NamedPipes WCF. Как вы, возможно, уже знаете, Metro не поддерживает именованные каналы. В итоге я использовал TcpBinding для полнодуплексного соединения.
Этот пост описывает, какие функции поддерживаются.
Образец моего WCF-сервера, который может использовать Metro-клиент, находится здесь .
Также имейте в виду, что вы не можете использовать синхронный WCF в Metro. Вам нужно будет использовать оболочку на основе задач, которая является только асинхронной.
И спасибо за вопрос. Я был для меня хорошей отправной точкой :)
источник
В конце // сборки / сеанса, на котором я присутствовал, возник ряд подобных вопросов. Алеш Голечек, исполнительный директор, который делал одну из сессий большой картины, вышел из аудитории, чтобы провести их. Даже если вы не разработчик C ++, загрузите этот сеанс и посмотрите вопросы и ответы. Http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C
Приложения Metro не могут рассчитывать на то, что настольные приложения или службы будут установлены на машине. А настольные приложения не могут рассчитывать на работу приложений Metro, поскольку их можно приостановить в любой момент. Вам нужно начать думать иначе. Послушайте Алеша об этом.
источник
localhost
напрямую через TCP-сокет, почему она позволяет делать то же самое через WCF?Обратите внимание, что с обновлением Windows 8.1 теперь официально поддерживается связь между приложениями Магазина Windows и компонентами рабочего стола, написанными на C # для .NET 4.5+ для приложений с боковой загрузкой в корпоративных сценариях:
Сосредоточенные компоненты среды выполнения Windows для загружаемых неопубликованных приложений из Магазина Windows
Цитировать:
Хотя реализация этого подхода изначально немного сложна, он обеспечивает глубокую интеграцию между Windows Store и компонентами рабочего стола. Просто имейте в виду, что на данный момент он не пройдет публичную сертификацию Магазина Windows.
источник
Существует статья на InfoQ о том , как построить слабосвязанные приложения Metro с обработчиками протокола. Это то, что уже давно поддерживается Windows, и можно предвидеть, что настольное приложение зарегистрируется как обработчик протокола, и, возможно, городское приложение сможет взаимодействовать через этот механизм.
Понятия не имею, возможно ли это, но было бы интересно проверить.
источник
Кристоф Насар написал в блоге о довольно хакерском способе сделать это с использованием локальных файлов. В результате происходит обмен данными между настольным приложением и приложением магазина Windows (в блоге именуемым DA / WSA) без необходимости переключаться между пользовательскими интерфейсами двух приложений. Он также написал в блоге о другой менее хитрой технике, связанной с обработчиками протоколов.
Обратите внимание, что наличие WSA, которое взаимодействует с DA, явно запрещено требованиями сертификации приложений магазина.
... но он ограничивает только "местные механизмы". Итак, я полагаю, можно создать веб-сервис для маршрутизации сообщений.
источник
Если вы думаете, что можете выполнить дополнительную операцию cmd вручную, вы можете попробовать:
CheckNetIsolation.exe включен в установку winRT, поэтому устанавливать ничего лишнего не нужно.
Попробовал: работает даже после обновления пакета.
Как показано на: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx
Здесь объясняется, как узнать packageID для вашего приложения: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- заместитель AppID-оф-а-метро-стиль-app-
источник
На одном компьютере можно обмениваться данными между приложением Metro и настольным приложением, используя локальную службу. Некоторое время назад я реализовал простое «доказательство концепции», как обойти песочницу WinRT с помощью локальной службы. По-прежнему нужна какая-то «социальная инженерия» или прямое руководство по установке сервиса, но в любом случае это возможно.
Однако я не уверен в правилах сертификации о связи "локальной службы" при добавлении такого приложения в Магазин Windows.
Образец здесь
источник
Возможно, я упустил суть, но при активации возможности частных сетей я могу подключиться к локальному запущенному (http) серверу, используя локальный IP-адрес (не localhost). Это позволяет использовать мой сценарий, в котором приложение winrt взаимодействует с настольным приложением wpf.
источник