Как приложение Metro в Windows 8 взаимодействует с настольным настольным окном на одном компьютере?

В ситуации, когда у вас есть интерфейс интерфейса, построенный с использованием нового стиля Metro для приложений для Windows 8, и хотел бы, чтобы он связывался с .NET-приложением, работающим на рабочем столе на том же локальном компьютере (например, приложение для Windows-приложений).

Какие формы межпроцессного взаимодействия доступны между приложением метро и настольным приложением?

Благодаря Павлу Минаеву из команды Visual Studio, который предоставил некоторую исходную информацию здесь в комментарии, процитировал:

По словам Мартина Ловелла, нет преднамеренного механизма для это, и некоторые, которые могут быть использованы для него, намеренно ограничены. Именованные каналы не существуют, например, и файлы с отображением памяти. Существуют сокеты (включая серверные сокеты), но при подключении к localhost, вы можете подключаться только к одному и тому же приложению. Вы можете использовать обычные файлы в одной из общих "известных папок" (Documents, Pictures и т.д.), но это довольно грубый хак, который требует опроса и видимый пользователю. - Павел Минаев, комментируя этот вопрос

Таким образом, сбойные обычные подходы я думал об использовании веб-сервисов или чтении/записи в базе данных, чтобы получить какую-то форму общения, обе из которых кажутся излишними, когда процессы работают на одной машине.

Я пытаюсь здесь понять смысл? Я вижу, что приложение метро должно быть интерфейсом UI для существующей службы, которая работает на рабочем столе. Или лучше просто использовать WPF для интерфейсного интерфейса пользователя, работающего на рабочем столе (т.е. Приложение, отличное от метро).

Ответ 1

Я портирую свой существующий проект на Win8 прямо сейчас. Он состоит из приложения Windows и приложения лотка, которые разговаривают друг с другом через NamedPipes WCF. Как вы уже знаете, Metro не поддерживает именованные каналы. Я закончил использование TcpBinding для полнодуплексного соединения.

Это сообщение описывает, какая функциональность поддерживается.

Образец моего WCF-сервера, который может потреблять клиент Metro, здесь.

Также имейте в виду, что вы не можете использовать синхронный WCF в Metro. Вам придется использовать Task, основанный на оболочке, который является только асинхронным.

И спасибо за ваш вопрос. Я был хорошей отправной точкой для меня:)

Ответ 2

В конце//сборки/сеанса, на котором я присутствовал, возник такой ряд вопросов. Алеш Холечек, исполнитель, который сделал одну из сессий большой картины, вышел из аудитории, чтобы справиться с ними. Даже если вы не разработчик С++, загрузите этот сеанс и посмотрите Q и A. http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Приложения Metro не могут рассчитывать на настольные приложения или службы, установленные на компьютере. И настольные приложения не могут рассчитывать на приложения Metro, поскольку они могут быть приостановлены в любое время. Вы должны начать думать по-другому. Слушайте Алеша на этом.

Ответ 3

Обратите внимание, что при обновлении Windows 8.1 связь между приложениями Windows Store и настольными компонентами, написанными на С# для .NET 4.5+, теперь официально поддерживается для загруженных приложений в сценариях Enterprise:

Компоненты исполняемой среды Windows для загруженных приложений Windows Store

Цитата:

Признавая, что критические бизнес-функции и правила воплощены в существующих программных активах, и что у предприятий есть множество различных сценариев, для которых новый стиль приложения будет очень продуктивным, обновление Windows 8.1 включает в себя новую функцию, называемую компонентами Runtime для Brokered, для боковые приложения. Мы используем термин IPC (межпроцессная связь), чтобы описать возможность запуска существующих ресурсов настольного программного обеспечения в одном процессе (компонент рабочего стола) при взаимодействии с этим кодом в приложении Windows Store. Это знакомая модель для корпоративных разработчиков, поскольку приложения баз данных и приложения, использующие службы NT в Windows, имеют сходную многопроцессорную архитектуру.

Несмотря на то, что реализация этого подхода на ранней стадии сложна, он позволяет осуществлять глубокую интеграцию между компонентами Windows Store и настольными компонентами. Просто имейте в виду, что пока он не пройдет сертификацию Windows Store.

Ответ 4

Существует статья на InfoQ о как создавать слабосвязанные приложения Metro с обработчиками протоколов. Это то, что долгое время поддерживалось Windows, и можно было предвидеть, что настольное приложение регистрируется как обработчик протокола, и, возможно, приложение метро может обмениваться данными через этот механизм.

Я не знаю, возможно ли это, но может быть интересно проверить.

Ответ 5

Если вы считаете, что можете выполнить дополнительную ручную операцию cmd, вы можете попробовать:

X:/> CheckNetIsolation.exe LoopbackExempt –a –n=<packageID>;

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-the-appid-of-a-metro-style-app-

Ответ 6

Christophe Nasarre в блоге о довольно хакерском способе сделать это, используя локальные файлы. В результате связь между приложениями для настольных приложений и приложений Windows (называемыми DA/WSA в блоге), без необходимости переключения между пользовательским интерфейсом двух приложений. Он также рассказал о другой менее хакерской технике, связанной с обработчиками протоколов.

Обратите внимание, что наличие WSA, который связывается с DA, явно запрещен в хранилище Требования к сертификации приложений

Приложения Windows Store не должны связываться с локальными настольными приложениями или службами через локальные механизмы, в том числе через файлы и ключи реестра.

... но ограничивает только "локальные механизмы". Поэтому я предполагаю, что можно создать веб-службу для маршрутизации сообщений.

Ответ 7

На одном и том же компьютере можно подключиться от приложения Metro к настольному приложению с помощью локальной службы. Я реализовал некоторое время назад простое "доказательство концепции", как обойти изолированную среду WinRT с помощью локальной службы. Ему все еще нужна какая-то "социальная инженерия" или прямой справочник по установке сервиса, но в любом случае это возможно.
Я не уверен, хотя о правилах сертификации об использовании "локальной службы" при добавлении такого приложения в Windows Store.

Пример здесь

По дизайну приложение Metro не может напрямую обращаться к базовому ПК, используя только API WinRT и доступные возможности. Но когда вы создаете серверную службу для доступа к ПК и всем данным там, она больше не работает в песочнице.

Единственная "проблема" заключается в том, что пользователь должен вручную установить эту внутреннюю службу, но это не будет проблемой при использовании некоторой "социальной инженерии":  Пользователь загружает приложение "ПК-браузер" Metro, пользователь может просматривать все изображения, музыку и видео, используя WinRT API, но приложение также показывает сообщение внизу:   "Загрузите PowerPack для ПК и просмотрите весь компьютер бесплатно"

Пользователь перенаправляется на веб-страницу, откуда пользователь может загрузить классический настольный установщик, содержащий "ПК-браузер" для доступа к файлам на всех ПК. Как только эта настольная служба установлена, приложение Metro может обнаружить ее и использовать для просмотра всего ПК. Пользователь счастлив, но песочница WinRT скомпрометирована.

Конечно, это не будет работать на планшетах Windows 8 ARM. Используя этот обходной путь, можно было бы даже создать клиентские приложения Metro для классических настольных приложений, таких как антивирусы, клиенты torrent/P2P и т.д.

Ответ 8

Возможно, я пропустил этот момент, но при активации возможности Private Networks я могу подключиться к локальному серверу (http), используя локальный IP-адрес (а не localhost). Это позволяет использовать мой сценарий, когда приложение winrt взаимодействует с приложением для рабочего стола wpf.