Windows 8のMetroアプリは、同じマシン上のバックエンドデスクトップアプリとどのように通信できますか?


120

Windows 8用の新しいMetroスタイルアプリを使用してUIフロントエンドを構築し、同じローカルマシン上のデスクトップで実行されている.NETアプリケーション(Windowsサービスアプリなど)と通信したい場合。

Metroアプリとデスクトップアプリの間で使用できるプロセス間通信の形式は何ですか?

Visual StudioチームのPavel Minaevに感謝します。

Martyn Lovellによれば、そのための意図的なメカニズムはなく、それに使用できるものは意図的に制限されています。たとえば、名前付きパイプは存在せず、メモリマップファイルも存在しません。ソケット(サーバーソケットを含む)がありますが、localhostに接続する場合、同じアプリにしか接続できません。共有「既知のフォルダー」(ドキュメント、画像など)の1つで通常のファイルを使用することもできますが、これはかなり粗雑なハックであり、ポーリングを必要とし、ユーザーに表示されます。- この問題についてコメントするPavel Minaev

したがって、通常のアプローチが失敗したため、Webサービスを使用したり、データベースへの読み取り/書き込みを行ったりして、何らかの形の通信を発生させようと考えていました。

ここで私が試みていることは意味がありますか?デスクトップで実行されている既存のサービスのフロントエンドUIとして、metroアプリが必要であることがわかります。または、デスクトップで実行されているフロントエンドUI(つまり、非メトロアプリ)にWPFを使用する方が良いでしょう。


2
ローカルWCFサービスについてはどうですか?
グレノ2011

2
質問で「Webサービスの使用について考える」の対象となる@Gleno。とは言っても、それが機能するかどうかは疑問です。.NETCoreで提供されるWCFクライアントライブラリの実装がWinRTソケットの上に構築されている場合は、おそらく同じ「ローカルホストなし」の制限が適用されます。これを確認する必要があります。
Pavel Minaev 2011

1
WCFのNetNamedPipeBindingとNetTcpBinding(localhost経由)は、メトロの制限により、いずれにしても利用できないようです。それはWebサービスまたはMSMQバインディングを残すでしょうか?正直なところ、WCF自体がメトロで利用できるかどうかはわかりません。
dodgy_coder '19

6
質問を変えて、次の質問をさせてください。通信しているデスクトップサービスが存在しない場合はどうなりますか?アプリケーションはストアからのみインストールできるため、デスクトップサービスの存在に依存できないことに注意してください。
ReinstateMonica Larry Osterman '19

3
企業はカスタムアプリをサイドロードしてWindowsストアをバイパスできるようです。その場合、一部のアプリケーションがエンタープライズ環境で実行されていると想定できることは理にかなっています。そうは言っても、元のポスターは彼の目的のためにデスクトップWPFフロントエンドを使用するべきだと思います。
Ankur Goel、2011

回答:


54

現在、既存のプロジェクトをWin8に移植しています。これは、NamedPipes WCFを介して互いに通信するWindowsサービスとトレイアプリケーションで構成されています。ご存知かもしれませんが、Metroは名前付きパイプをサポートしていません。全二重接続にTcpBindingを使用してしまいました。

この投稿では、サポートされている機能について説明します。

Metroクライアントが使用できるWCFサーバーのサンプルはこちらです。

また、Metroでは同期WCFを使用できないことに注意してください。非同期のみであるTaskベースのラッパーを使用する必要があります。

そして質問ありがとうございます。私は私にとって良い出発点でした:)


7
このおかげで...それは大きな助けです。できない/できないと言われるのではなく、実際的な答えを見るのは良いことです。
dodgy_coder

1
ばかげた質問かもしれませんが、サンプルを使用してlocalhostに接続するかどうかはどうですか?リンク先の質問は、Visual Studioの内部を示しています(パスから推定しましたが、間違っている場合は修正してください)。WCF(localhostと組み合わせて)はWCFの外部で機能しますか?
dzendras 2012

1
@dzendrasもちろん、動作します。localhostでも動作します。
エキスパート

3
ただし、このようなアプリがStore認定に合格するとは思えません。
Ani

6
これが何らかのルールである場合、「3.9すべてのアプリロジックはアプリパッケージから発生し、アプリパッケージ内に存在する必要があります。アプリは、コードの動的な組み込みや、アプリケーションがWindowsランタイムと対話する方法を変更するデータ、またはストアポリシーに関して動作するデータ。たとえば、リモートスクリプトをダウンロードして、その後、アプリパッケージのローカルコンテキストでそのスクリプトを実行することは許可されていません。」
アニ

38

私が参加した// build /セッションの最後に、このような質問がたくさんありました。全体像のセッションの1つを行った幹部であるAlešHolečekは、それらを処理するために聴衆から集まりました。C ++開発者でない場合でも、そのセッションをダウンロードしてQ&Aをご覧ください。http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Metroアプリは、マシンにインストールされているデスクトップアプリやサービスに依存できません。また、デスクトップアプリは、いつでも中断できるため、Metroアプリの実行を期待できません。別に考え始める必要があります。これでアレシュを聞いてください。


6
この正確な質問は、ビデオの47:20に尋ねられるようです。
Pavel Minaev 2011

3
...そしてもう1つは55:00です。答えは、一般的に言えば、「それはできない」ということです。
Pavel Minaev 2011

1
@dodgy_coder WCF / TCP(またはHTTP)が同じマシンで動作するかどうかはわかりません。サンドボックスでlocalhostTCPソケットを介して直接接続できない場合、なぜWCFを介して同じことができるのですか?
Pavel Minaev 2011

2
興味深いことに、共有コントラクトを介して2つのメトロアプリ間の通信をサポートする機能が組み込まれていますが、これは使用方法がクリップボードと似ているようで、2つのアプリを実装するのではなく、ソースアプリからターゲットアプリに一方向で転送するためのものです。双方向通信プロトコル。
dodgy_coder

4
サイドロードされたLOB Metroアプリは、インストールされているデスクトップアプリやサービスによっては問題ないと思われます。この非常に実用的なシナリオがサポートされないとは信じられません。Silverlightを使用すると、デスクトップ/ネイティブの相互運用機能が徐々に増加します...これらのシナリオに沿った何か(名前付きパイプ、メモリマップファイルなど...)がサポートされると確信しています(ガイダンスドキュメントを使用)将来は。
David Cuccia

11

Windows 8.1 Updateでは、.NET 4.5以降のC#で記述されたWindowsストアアプリとデスクトップコンポーネント間の通信が、エンタープライズシナリオのサイドロードアプリケーションで正式にサポートされるようになりました。

サイドロードされたWindowsストアアプリ用のブローカーWindowsランタイムコンポーネント

引用するには:

重要なビジネス機能とルールが既存のソフトウェア資産に組み込まれていること、および企業には新しいアプリケーションスタイルの生産性が非常に高いさまざまなシナリオがあることを認識して、Windows 8.1 Updateには、サイドロード用のブローカーWindowsランタイムコンポーネントと呼ばれる新機能が含まれていますアプリケーション。IPC(プロセス間通信)という用語は、Windowsストアアプリでこのコードを操作しながら、既存のデスクトップソフトウェア資産を1つのプロセス(デスクトップコンポーネント)で実行する機能を表すために使用します。これは、データベースアプリケーションとWindowsのNTサービスを利用するアプリケーションが同様のマルチプロセスアーキテクチャを共有しているため、企業開発者にはおなじみのモデルです。

このアプローチを実装することは、最初は少し複雑な側面ですが、Windowsストアとデスクトップコンポーネント間の深い統合を可能にします。とりあえず、Windowsストアの認定には合格しないことに注意してください。


5

プロトコルハンドラーを使用して疎結合のMetroアプリを構築する方法に関するInfoQ記事があります。これは、長い間Windowsでサポートされてきたものであり、デスクトップアプリケーションがプロトコルハンドラーとして自分自身を登録し、おそらくMetroアプリケーションがこのメカニズムを介して通信できると予測できます。

これが可能かどうかはわかりませんが、チェックしてみると面白いかもしれません。


この記事では、「Metroでこれを行うには[別のアプリケーションの別のワークフローにジャンプします-アプリは小さくて焦点が絞られているため]はプロトコルを利用することです。上記の例では、プロトコルは次のようになります。 「acme-stock-purchase:// client = 123&stock = XYZ」。 " -技術的に「プロトコルの活用」とはどういう意味ですか?
Lumi

このアプローチの問題は、それが一方向の通信にすぎないことです。
エキスパート、

3

Christophe Nasarreさんは、ローカルファイルを使用してややハックな方法でブログを書いています。その結果、2つのアプリのUIを切り替えることなく、デスクトップアプリ/ Windowsストアアプリ(ブログではDA / WSAと呼ばれます)間の通信が可能になります。また、プロトコルハンドラーを使用した、それほどハッキングされていない別の手法についてブログを書いています。

DAと通信するWSAを持つことは、ストアアプリの認定要件によって明示的に禁止されていることに注意してください。

Windowsストアアプリは、ファイルやレジストリキーを含むローカルメカニズムを介して、ローカルデスクトップアプリケーションまたはサービスと通信してはなりません。

...しかし、「ローカルメカニズム」のみを制限します。したがって、通信をルーティングするためのWebサービスを構築できると思います。


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


内部アプリケーションのローカルホストと通信できるようにしたいと思っていましたが、このコマンドを使用して、VSを実行していないコンピューターでのみ通信を発生させることができました。
アドサイグア2014年

2

ローカルサービスを使用して、Metroアプリからデスクトップアプリに同じマシンで通信することが可能です。少し前に、ローカルサービスを使用してWinRTサンドボックスをバイパスする簡単な「概念実証」を実装しました。それでも、サービスをインストールするために何らかの「ソーシャルエンジニアリング」または直接ガイドが必要ですが、とにかくそれは可能です。
そのようなアプリをWindowsストアに追加するときの「ローカルサービス」通信に関する認定ルールについては、よくわかりません。

ここにサンプル

設計上、Metroアプリケーションは、WinRT APIと使用可能な機能を使用するだけで、基盤となるPCに直接アクセスできません。ただし、PCとそこにあるすべてのデータにアクセスするためのバックエンドサービスを作成すると、基本的にはサンドボックスで実行されなくなります。

唯一の「問題」は、ユーザーがこのバックエンドサービスを手動でインストールする必要があることですが、一部の「ソーシャルエンジニアリング」を使用しても問題はありません。ユーザーは「PCブラウザ」Metroアプリをダウンロードし、ユーザーはすべての画像、音楽、ビデオを閲覧できます、WinRT APIを使用しますが、アプリは下部に「PCブラウザーのパワーパックをダウンロードしてPC全体を無料で閲覧できます」というメッセージも表示します。

ユーザーはWebページにリダイレクトされ、そこからユーザーはPC全体のファイルにアクセスするための「PCブラウザー」バックエンドサービスを含むクラシックデスクトップインストーラーをダウンロードできます。このデスクトップサービスがインストールされると、Metroアプリはそれを検出し、PC全体を閲覧するために使用できます。ユーザーは満足していますが、WinRTサンドボックスは危険にさらされています。

もちろん、これはWindows 8 ARMタブレットでは機能しません。この回避策を使用すると、ウイルス対策ソフトウェア、トレント/ P2Pクライアントなどのクラシックデスクトップアプリ用のMetroアプリクライアントを構築することもできます。


3
なぜソーシャルエンジニアリングについて言及する必要があるかわからない...元の質問はメトロアプリと通信するデスクトップアプリ/サービスについて話しているため、ユーザーはデスクトップアプリ/サービスを個別にインストールする必要があると予想されます。では、デスクトップサービスとMetroアプリの間でどのような通信方法を使用しましたか?
dodgy_coder

0

ポイントを逃したかもしれませんが、プライベートネットワーク機能をアクティブにすると、ローカルのIPアドレス(localhostではない)を使用してローカルの実行中の(http)サーバーに接続できます。これにより、winrtアプリがwpfデスクトップアプリと通信する私のシナリオが可能になります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.