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

120

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

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

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

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

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

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

dodgy_coder
источник
2
А как насчет местной службы WCF?
Gleno
2
@Gleno, который будет охватывать «размышления об использовании веб-сервисов» в вопросе. Тем не менее, мне интересно, будет ли это вообще работать - если реализация клиентской библиотеки WCF, которая предоставляется в .NET Core, построена на основе сокетов WinRT, то, вероятно, будет применяться то же ограничение «no localhost». Это нужно проверить.
Павел Минаев
1
Похоже, что NetNamedPipeBinding и NetTcpBinding WCF (через localhost) в любом случае не будут доступны из-за ограничений в метро. Что оставит веб-службы или привязки MSMQ? Честно говоря, я не уверен, доступен ли сам WCF в метро.
dodgy_coder
6
Позвольте мне перевернуть ваш вопрос и спросить вас: что произойдет, если настольная служба, с которой вы общаетесь, отсутствует? Помните, что ваше приложение можно установить только из магазина, и поэтому оно не может полагаться на наличие службы рабочего стола.
ReinstateMonica Larry Osterman
3
Похоже, что предприятия могут загружать неопубликованные приложения и обходить Магазин Windows. Если это так, было бы разумно предположить, что некоторые приложения работают в корпоративной среде. Тем не менее, я думаю, что исходный постер должен использовать для своих целей интерфейс рабочего стола WPF.
Ankur Goel

Ответы:

54

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

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

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

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

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

эксперт
источник
7
Спасибо за это ... это большая помощь. Приятно видеть практический ответ, а не просто говорить, что этого нельзя / нельзя делать.
dodgy_coder
1
Это может быть глупый вопрос ... но вы можете подключиться к localhost, используя свой образец или нет? Вопрос, на который вы ссылаетесь, показывает внутреннее устройство Visual Studio (я понял это из пути, но если я ошибаюсь, поправьте меня). Работает ли WCF (в сочетании с localhost) вне WCF?
dzendras
1
@dzendras Конечно, сработает. Он также будет работать с localhost.
эксперт
3
Однако я сомневаюсь, что подобное приложение пройдет сертификацию магазина.
Ani
6
Во всяком случае, это правило, которое, я думаю, может быть процитировано "3.9 Вся логика приложения должна происходить из вашего пакета приложения и находиться в нем. Приложение не должно пытаться изменить или расширить упакованный контент с помощью любой формы динамического включения кода или данные, которые изменяют то, как приложение взаимодействует со средой выполнения Windows или ведет себя в отношении политики Магазина. Недопустимо, например, загружать удаленный сценарий и впоследствии выполнять этот сценарий в локальном контексте вашего пакета приложения ».
Ани
38

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

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

Кейт Грегори
источник
6
Кажется, именно этот вопрос задают в видео в 47:20.
Павел Минаев
3
... и еще один в 55:00. Ответ, вообще говоря, такой: «Нет, ты не можешь этого сделать».
Павел Минаев
1
@dodgy_coder Я не уверен, что WCF / TCP (или HTTP) будет работать на одном компьютере. Если песочница не позволяет подключаться localhostнапрямую через TCP-сокет, почему она позволяет делать то же самое через WCF?
Павел Минаев
2
Интересно, что есть встроенная поддержка для связи между двумя городскими приложениями через общие контракты, но, похоже, это похоже на использование буфера обмена и для односторонней передачи из исходного приложения в целевое приложение, а не для реализации, скажем, двух протокол двусторонней связи.
dodgy_coder
4
Мне кажется, что у LOB-приложений Metro с боковой загрузкой не будет проблем в зависимости от установленного настольного приложения или службы. Мне трудно поверить, что этот очень практичный сценарий не будет поддержан. В Silverlight мы увидели постепенное увеличение возможностей взаимодействия между настольными компьютерами и собственными устройствами ... Я почти уверен, что что-то в этих сценариях (именованные каналы, файлы с отображением памяти или что-то в этом роде ...) будет поддерживаться (с руководящими документами) в будущем.
Дэвид Куччиа
11

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

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

Цитировать:

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

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

ig2r
источник
5

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

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

tronda
источник
В статье говорится: «Вы можете сделать это в Metro [перейти к другому рабочему процессу в другом приложении - потому что ваше приложение должно быть небольшим и сфокусированным], используя протоколы. В нашем примере выше протокол может выглядеть так: «акме накоплениях покупки: // клиент = 123 & запас = XYZ» «. - Что технически означает «использование протоколов»?
Lumi
Проблема с этим подходом в том, что это только одностороннее общение.
эксперт
3

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

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

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

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

twj
источник
3

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

fgalliat
источник
Я хотел иметь возможность общаться с localhost для внутреннего приложения, и я мог сделать это только на компьютерах, на которых не запущен VS, с помощью этой команды.
adosaiguas
2

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

Образец здесь

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

Единственная «проблема» заключается в том, что пользователь должен вручную установить эту внутреннюю службу, но это не будет проблемой при использовании некоторой «социальной инженерии»: пользователь загружает приложение Metro «Браузер ПК», пользователь может просматривать все изображения, музыку и видео. , используя WinRT API, но приложение также показывает сообщение внизу: «Загрузите наш пакет расширения для браузера ПК и просматривайте весь свой компьютер БЕСПЛАТНО»

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

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

Мартин Сучан
источник
3
Не уверен, почему вам нужно упомянуть о социальной инженерии ... поскольку исходный вопрос касается настольного приложения / службы, говорящего с приложением для метро, ​​ожидается, что пользователю потребуется установить настольное приложение / службу отдельно. Итак, какой метод связи между настольной службой и приложением метро вы использовали?
dodgy_coder 02
0

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

Венделин
источник