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


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

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

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

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

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

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

8 116

8 ответов:

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

этот пост описывает, какие функции поддерживаются.

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

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

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

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

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

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

посреднические компоненты среды выполнения Windows для приложений Магазина Windows с боковой загрузкой

цитата:

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

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

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

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

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

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

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

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

Если вы думаете, что вы можете сделать дополнительную ручную операцию 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-

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

пример здесь

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

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

пользователь перенаправляется на веб-страницу, откуда пользователь может скачать классический Desktop installer, содержащий "PC browser" back-end service для доступа к файлам на всех ПК пользователей. После того, как эта настольная служба установлена, приложение Metro может обнаружить ее и использовать для просмотра всего ПЕРСОНАЛЬНЫЙ КОМПЬЮТЕР. Пользователь доволен, но песочница WinRT скомпрометирована.

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

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