Як програма Metro в Windows 8 може спілкуватися з додатком настільного комп’ютера на одній машині?


120

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

Які форми міжпроцесорного зв’язку доступні між додатком метро та настільним додатком?

Дякуємо Павлу Мінаєву з команди Visual Studio, який надав тут деякі коментарі в коментарі, цитуючи:

За словами Мартіна Ловелла, для цього немає жодного обдуманого механізму, і деякі, які могли б бути використані для цього, навмисно обмежені. Наприклад, іменованих труб немає, наприклад, файлів із картографічною пам'яттю. Є розетки (включаючи серверні розетки), але при підключенні до localhost ви можете підключитися лише до того самого додатка. Ви можете використовувати звичайні файли в одній із загальнодоступних "відомих папок" (Документи, Зображення тощо), але це досить груба хакерська робота, яка потребує опитування та є видимою для користувача. - Павло Мінаєв коментує це питання

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

Це те, що я намагаюся тут, має сенс? Я бачу необхідність у програмі метро бути інтерфейсом інтерфейсу для існуючої послуги, яка працює на робочому столі. Або краще просто використовувати WPF для інтерфейсу інтерфейсу, що працює на робочому столі (тобто, не метро).


2
Що з місцевою службою WCF?
Глено

2
@Gleno, що стосуватиметься "думки про використання веб-сервісів" у питанні. З цього приводу, мені цікаво, чи це навіть спрацює - якщо реалізація клієнтської бібліотеки WCF, яка надається в .NET Core, побудована поверх сокетів WinRT, то, мабуть, не застосовуватиметься те саме обмеження "жодного localhost". Це потрібно перевірити.
Павло Мінаєв

1
Схоже, NetNamedPipeBinding і NetTcpBinding WCF (через localhost) все одно не будуть доступні через обмеження в метро. Це може залишити веб-сервіси чи прив'язки MSMQ? Я не впевнений, чи наявний WCF у метро, ​​якщо чесно.
dodgy_coder

6
Дозвольте мені перевернути ваше запитання і запитати вас: Що станеться, якщо настільний сервіс, з яким ви спілкуєтесь, немає? Пам’ятайте, що ваш додаток можна встановити лише з магазину, і тому він не може покладатися на наявність служби настільних ПК.
ReinstateMonica Ларрі Остерман

3
Здається, що підприємства можуть завантажувати власні програми та обходити Windows Store. Якщо так, то було б сенс, що ви можете припустити, що деякі програми працюють у середовищі підприємства. При цьому, я думаю, що оригінальний плакат повинен використовувати настільний WPF-фронт для своїх цілей.
Ankur Goel

Відповіді:


54

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

У цій публікації описано, яка функціональність підтримується.

Зразок мого сервера WCF, який може споживати клієнт Metro, є тут .

Також майте на увазі, що ви не можете використовувати синхронний WCF в метро. Вам доведеться використовувати обгортку на основі завдань, яка є лише асинхронною.

І дякую за запитання. Я був гарною відправною точкою для мене :)


7
Дякую за це ... це чудова допомога. Добре бачити практичну відповідь, а не просто говорити, що цього робити не можна / не можна.
dodgy_coder

1
Це може бути дурним питанням ... але ви можете підключитися до localhost за допомогою свого зразка чи ні? Питання, на яке ви посилаєтесь, показує внутрішню програму Visual Studio (я вивів це із шляху, але якщо я помиляюся, будь ласка, виправте мене). Чи працює WCF (у поєднанні з localhost) поза WCF?
дендрас

1
@dzendras Звичайно, це спрацює. Він також буде працювати з localhost.
експерт

3
Я сумніваюся, що додаток, подібний до цього, пройшов би сертифікацію магазину.
Ані

6
Якщо що-небудь це правило, я думаю, що це може бути цитувано "3.9 Вся логіка програми повинна походити з вашого пакета додатків і знаходитися в ньому. Ви додаток не повинні намагатися змінювати або розширювати пакуючи вміст за допомогою будь-якої форми динамічного включення коду або дані, які змінюють взаємодію програми на порядок роботи з Windows або поведінку щодо політики зберігання. Наприклад, неприпустимо завантажувати віддалений скрипт і згодом виконувати цей сценарій у локальному контексті пакету додатків ".
Ані

38

У кінці // побудови / сесії, в якій я брав участь, було ряд таких питань. Алеш Холечек, виконавець, який зробив одну з великих фотосесій, вийшов із аудиторії, щоб обробити їх. Навіть якщо ви не розробник C ++, завантажте сеанс і перегляньте питання Q&A. Http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Програми метро не можуть розраховувати на додатки для настільних ПК або послуги, встановлені на машині. І настільні програми не можуть розраховувати на запущені програми Metro, оскільки їх можна будь-коли призупинити. Почати потрібно думати інакше. Слухай Алеша на цьому.


6
Це точно запитання, здається, задають о 47:20 у відео.
Павло Мінаєв

3
... і ще один о 55:00. Відповідь, взагалі кажучи, здається, "ні, ви не можете цього зробити".
Павло Мінаєв

1
@dodgy_coder Я не впевнений, що WCF / TCP (або HTTP) буде працювати на одній машині. Якщо пісочниця не дозволяє вам підключитися localhostбезпосередньо через сокет TCP, чому б він дозволив вам робити те саме через WCF?
Павло Мінаєв

2
Цікаво, що існує підтримка для спілкування між двома програмами метро за допомогою контрактів на паї, але це, схоже, схоже як на використання в буфер обміну, так і на передачу в одну сторону з вихідного додатку до цільового додатку, а не для реалізації скажіть два -протокол зв’язку.
dodgy_coder

4
Мені здається, що завантажені додатком метро LOB зі стороною не матимуть проблем, залежно від встановленого настільного додатка чи послуги. Мені важко вірити, що цей дуже практичний сценарій не буде підтримуватися. З Silverlight ми спостерігали поступове збільшення можливостей робочого столу / нативного інтеропа ... Я майже впевнений, що за цими сценаріями (названі труби, файли, нанесені на пам'ять, чи що-небудь ...) буде підтримуватися (з документами керівництва) у майбутньому.
David Cuccia

11

Зауважте, що за допомогою оновлення Windows 8.1, зв’язок між додатками Windows Store та компонентами робочого столу, написаними на C # for .NET 4.5+, тепер офіційно підтримується для завантажених додатків у сценаріях Enterprise:

Посередні компоненти Windows Runtime для завантажених додатків Windows Store збоку

Цитувати:

Визнаючи, що критичні бізнес-функції та правила втілені в існуючих програмних активах і що у підприємств існує широкий спектр сценаріїв, для яких новий стиль застосування буде високопродуктивним, оновлення Windows 8.1 включає в себе нову функцію під назвою Brokered Components Windows Runtime Components для бічних завантажених додатки. Ми використовуємо термін IPC (міжпроцесовий зв’язок) для опису здатності запускати наявні активи настільних програм в одному процесі (компонент настільних ПК) під час взаємодії з цим кодом у додатку Windows Store. Це звична модель розробникам підприємств, оскільки програми та бази даних, що використовують сервіси NT у Windows, мають схожу багатопроцесорну архітектуру.

Хоча реалізація цього підходу спочатку трохи є складною стороною, він дозволяє глибоко інтегруватись у компоненти Windows Store та настільних ПК. Пам’ятайте лише про те, що наразі ця сертифікація не зберігатиметься для загальнодоступних сертифікатів Windows Store.


5

Є стаття про InfoQ про те, як створити вільно поєднані програми Metro з обробниками протоколів. Це те, що підтримується Windows протягом тривалого часу, і можна було передбачити, як настільний додаток зареєструється як обробник протоколів, і, можливо, програма метро може спілкуватися через цей механізм.

Я поняття не маю, чи це можливо, але це може бути цікаво перевірити.


У статті йдеться: "Те, як ви можете це зробити в Metro [перейти на інший робочий процес у іншому додатку - оскільки ваша програма призначена для малих та сильно сфокусованих], це шляхом використання протоколів. Для нашого прикладу вище протокол може виглядати так "Покупка акме-акцій: // клієнт = 123 & акція = XYZ". - Тільки що це технічно означає "використання протоколів"?
Лумі

Проблема такого підходу полягає в тому, що це лише один спосіб спілкування.
експерт

3

Крістоф Насарр провів блог про досить Hacky спосіб зробити це з допомогою локальних файлів. Результатом є зв’язок між додатком для настільних програм / магазином Windows (у блозі називається DA / WSA), без необхідності перемикатися між інтерфейсом користувача двох додатків. Він також розмовляв про ще одну менш хакітну техніку із залученням протоколів.

Зауважте, що наявність WSA, яка спілкується з DA, явно заборонена вимогами сертифікації додатка магазину

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

... але це обмежує лише "локальні механізми". Тому я думаю, що можна створити веб-сервіс для маршрутизації комунікацій.


3

Якщо ви думаєте, що можете зробити додаткову операцію cmd вручну, ви можете спробувати:

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

CheckNetIsolation.exe включений у встановлення winRT, тому нічого додаткового не можна встановлювати.

Я спробував це: він працює, навіть після оновлення пакету.

Як показано на: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Тут пояснено, як дізнатись пакет ID для вашого додатка: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- додаток-в-метро-стиль-додаток-


Я хотів мати можливість спілкуватися з localhost для внутрішньої програми, і я міг зробити це лише на комп'ютерах, де не працює VS за допомогою цієї команди.
adosaiguas

2

Можливість спілкуватися на одній машині від програми Metro до програми для настільних ПК за допомогою місцевого сервісу. Я реалізував деякий час тому просте "доказ концепції", як обійти пісочницю WinRT за допомогою локального сервісу. Ще потрібна якась «соціальна інженерія» або прямий посібник для встановлення послуги, але все одно це можливо.
Я навіть не впевнений, що стосується правил сертифікації зв'язку "локальної служби" під час додавання такого додатка в Windows Store.

Зразок тут

За задумом програми Metro не можуть отримати доступ до базового ПК безпосередньо, лише використовуючи API WinRT та наявні можливості. Але коли ви створюєте бек-енд-сервіс для доступу до ПК та всіх даних там, він в основному більше не працює в пісочниці.

Єдина "проблема" полягає в тому, що користувач повинен встановити цю службу бек-енду вручну, але це не буде проблемою за допомогою "соціальної інженерії": Користувач завантажує додаток Metro "браузер ПК", користувач може переглядати всі зображення, музику та відео , використовуючи API WinRT, але додаток також відображає повідомлення внизу: "Завантажте наш пакет живлення та перегляньте весь ПК, БЕЗКОШТОВНО"

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

Звичайно, це не буде працювати на планшетах Windows 8 ARM. За допомогою цього вирішення можливо навіть створити клієнтів програм Metro для класичних додатків для настільних ПК, таких як антивіруси, клієнти-торенти / P2P тощо.


3
Не впевнений, чому вам потрібно згадати про соціальну інженерію ... оскільки в оригінальному питанні йдеться про настільний додаток / послугу, що розмовляють із додатком метро, ​​очікується, що користувачеві потрібно буде встановити додаток / послугу для настільних ПК окремо. То який спосіб спілкування ви використовували між службою настільних ПК та додатком метро?
dodgy_coder

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.