How can a Metro app in Windows 8 communicate with a backend desktop app on the same machine?

In a situation where you have the UI frontend built using the new Metro style of apps for windows 8, and would like it to communicate with a .NET application running on the desktop on the same local machine (e.g. a windows service app).

What forms of interprocess communication are available between the metro app and the desktop app?

Thanks to Pavel Minaev of the Visual Studio team, who has provided some initial info here in a comment, quoted:

According to Martyn Lovell, there isn't any deliberate mechanism for that, and some that could be used for it are intentionally restricted. Named pipes aren't there, for example, nor are memory mapped files. There are sockets (including server sockets), but when connecting to localhost, you can only connect to the same app. You could use normal files in one of the shared "known folders" (Documents, Pictures etc), but that is a fairly crude hack that necessitates polling and is visible to the user. -- Pavel Minaev commenting on this issue

So failing normal approaches I was thinking of using web services or reading/writing to a database in order to get some form of communication happening, both of which seem like overkill when the processes are running on the same machine.

Is what I'm attempting here making sense? I can see a need for a metro app to be the frontend UI for an existing service which is running on the desktop. Or is it better to just use WPF for the frontend UI running on the desktop (i.e. a non-metro app).

40080 次浏览

在我参加的一次//构建/会议结束时,有许多类似的问题。Ale Hole ek,负责一个重要会议的执行官,走出观众席来处理这些问题。即使你不是 C + + 开发人员,也可以下载该会话并观看问答 http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Metro 应用程序不能指望桌面应用程序或服务安装在机器上。桌面应用程序不能指望 Metro 应用程序运行,因为它们可以随时被暂停。你得换个角度思考了。听 Ale 的。

InfoQ上有一个关于如何使用协议处理程序构建松散耦合的 Metro 应用程序的 文章。这是 Windows 长期以来一直支持的东西,我们可以预见桌面应用程序注册本身作为协议处理程序,也许都市应用程序可以通过这种机制进行通信。

我不知道这是否可行,但是去看看可能会很有趣。

我现在正在将我现有的项目移植到 Win8。它由窗口服务和托盘应用程序组成,它们通过 NamedPipes WCF 相互通信。你可能已经知道 Metro 不支持命名管道。我最终使用 TcpBinding 进行全双工连接。

这篇文章 描述了支持哪些功能。

Metro 客户端可以使用的 WCF 服务器示例是 译自: 美国《经济学人》杂志网站(http://stackoverflow. com/questions/9372667/endpoint-is-not-盆景不兼容-with-version-1-of-windows-immersive-project)

Also keep in mind that you can't use synchronous WCF in Metro. You'll have to use 任务-based wrapper which is only asynchronous.

谢谢你的问题,我是一个很好的起点:)

使用本地服务可以在同一台机器上从 Metro 应用程序到桌面应用程序进行通信。 前段时间我实现了一个简单的“概念验证”,即如何使用本地服务绕过 WinRT 沙盒。它仍然需要某种“社会工程”或直接指导安装服务,但无论如何,这是可能的。
I'm not sure though about the certification rules about "local service" communication when adding such app to Windows Store.

样本在这里

根据设计 Metro 应用程序不能直接访问底层 PC,只能使用 WinRT API 和可用功能。但是,当您创建用于访问 PC 和所有数据的后端服务时,它基本上不再在沙箱中运行。

唯一的“问题”是用户必须手动安装这个后端服务,但是使用一些“社会工程”不会有问题: 用户下载“ PC 浏览器”Metro 应用程序,用户可以浏览所有的图片,音乐和视频,使用 WinRT API,但该应用程序也显示在底部的信息: “下载我们的电脑浏览器 PowerPack 和浏览您的整个电脑,免费”

用户被重定向到网页,从那里用户可以下载经典的桌面安装程序包含“ PC 浏览器”后端服务访问用户整个 PC 上的文件。一旦安装了这个桌面服务,Metro 应用程序就可以检测到它,并用它浏览整个 PC。用户很满意,但是 WinRT 沙盒受到了损害。

当然,这在 Windows8ARM 平板电脑上是行不通的。使用这种解决方案,甚至可以为经典的桌面应用程序(如杀毒软件、 Torrent/P2P 客户端等)构建 Metro 应用程序客户端。

如果你认为你可以做一个额外的手动 cmd 操作, 你可以试试:

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

CheckNetIsolation.exe is included in winRT install, so there is nothing extra to be installed.

我试过了: 它工作,甚至包更新后。

如图所示: 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-

Christophe Nasarre 提供了一种使用本地文件完成这项工作的相当古怪的方法 博客。其结果是桌面应用程序/Windows 商店应用程序之间的通信(在博客中称为 DA/WSA) ,而不必在两个应用程序的 UI 之间切换。他还在博客中介绍了另一种涉及协议处理程序的不那么黑客的技术。

注意,具有与 DA 通信的 WSA 的存储 应用程序认证要求明确禁止

WindowsStore 应用程序不能通过本地机制(包括通过文件和注册表项)与本地桌面应用程序或服务通信。

... 但它只限于“本地机制”。所以我想人们可以建立一个网络服务来路由通信。

请注意,在 Windows 8.1 Update 中,Windows Store 应用程序和用 C # for 编写的桌面组件之间的通信。NET 4.5 + 现在正式支持企业场景中的侧载应用程序:

用于侧面加载的 Windows 应用程序的代理 Windows 运行时组件

引用如下:

Recognizing that critical business functions and rules are embodied in existing software assets and that enterprises have a wide variety of scenarios for which the new application style will be highly productive, the Windows 8.1 Update includes a new feature called Brokered Windows Runtime Components for side-loaded applications. We use the term IPC (inter-process communication) to describe the ability to run existing desktop software assets in one process (desktop component) while interacting with this code in a Windows Store app. This is a familiar model to enterprise developers as data base applications and applications utilizing NT Services in Windows share a similar multi-process architecture.

尽管实现这种方法最初有点复杂,但它允许在 Windows Store 和桌面组件之间进行深度集成。只要记住,就目前而言,它不会通过公共 WindowsStore 认证。

也许我没有注意到这一点,但是当激活专用网络功能时,我可以使用本地 IP 地址(而不是本地主机)连接到本地运行的(http)服务器。这使我的场景中的 wrt 应用程序与 wpf 桌面应用程序通信成为可能