Windows 8中的Metro应用程序如何与同一台机器上的后端桌面应用程序通信?

本文关键字:应用程序 机器 一台 后端 通信 桌面 Metro 中的 Windows | 更新日期: 2023-09-27 18:08:53

如果你的UI前端使用windows 8的新Metro风格的应用程序构建,并希望它与同一台本地机器上运行在桌面上的。net应用程序(例如windows服务应用程序)进行通信,

metro应用程序和桌面应用程序之间有什么形式的进程间通信?

感谢Visual Studio团队的Pavel Minaev,他在评论中提供了一些初步信息,引用:

根据Martyn Lovell的说法,没有任何故意的机制这一点,以及一些可以用于它的是有意限制的。例如,没有命名管道,也没有内存映射文件。有套接字(包括服务器套接字),但是当连接到localhost,你只能连接到同一个应用。你可以使用normal文件在一个共享的"已知文件夹"(文档,图片等),但这是一种相当粗糙的黑客攻击,需要进行民意调查对用户可见。——Pavel Minaev对这个问题的评论

所以失败的正常方法,我正在考虑使用web服务或读/写数据库,以获得某种形式的通信发生,这两种方式似乎都是多余的,当进程运行在同一台机器上。

我在这里尝试的是有意义的吗?我可以看到需要一个地铁应用程序的前端UI为现有的服务,这是在桌面上运行。还是使用WPF作为运行在桌面上的前端UI(即非metro应用程序)更好?

Windows 8中的Metro应用程序如何与同一台机器上的后端桌面应用程序通信?

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

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

Metro客户端可以使用的WCF服务器示例是

还要记住,你不能在Metro中使用同步WCF。您必须使用基于任务的包装器,它只是异步的。

谢谢你的问题。我对我来说是个很好的起点:)

在我参加的//build/会议结束时,有很多这样的问题。负责其中一场大型专题讨论会的高管阿莱什·霍尔埃克(alestos hole ek)从观众席中走出来,负责处理这些问题。即使您不是c++开发人员,也可以下载该会话并观看Q &答:http://channel9.msdn.com/events/build/build2011/tool - 789 c

Metro应用程序不能依赖安装在机器上的桌面应用程序或服务。桌面应用程序不能指望Metro应用程序运行,因为它们可以随时暂停。你需要开始用不同的方式思考。听听阿莱什对此的看法。

请注意,在Windows 8.1更新中,Windows商店应用程序和用c#为。net 4.5+编写的桌面组件之间的通信现在正式支持企业场景下的侧加载应用程序:

为侧面加载的Windows Store应用程序提供代理的Windows运行时组件

引用:

认识到关键的业务功能和规则体现在现有的软件资产中,并且企业有各种各样的场景,新的应用程序样式将是高效的,Windows 8.1更新包括一个名为代理Windows运行时组件的新特性,用于侧加载应用程序。我们使用术语IPC(进程间通信)来描述在一个进程(桌面组件)中运行现有桌面软件资产的能力,同时与Windows Store应用程序中的代码进行交互。对于企业开发人员来说,这是一个熟悉的模型,因为数据库应用程序和利用Windows NT服务的应用程序共享类似的多进程架构。

虽然最初实现这种方法有点复杂,但它允许跨Windows Store和桌面组件的深度集成。请记住,目前它还不能通过Windows Store的公共认证。

InfoQ上有一篇关于如何用协议处理程序构建松耦合Metro应用程序的文章。这是Windows已经支持很长时间的东西,我们可以预见桌面应用程序将自己注册为协议处理程序,也许metro应用程序可以通过这种机制进行通信。

我不知道这是否可能,但检查一下可能会很有趣。

Christophe Nasarre在他的博客中介绍了一种使用本地文件的相当粗糙的方法。结果是桌面应用程序/windows商店应用程序(在博客中称为DA/WSA)之间的通信,而无需在两个应用程序的UI之间切换。他还在博客中提到了另一种涉及协议处理程序的不那么黑客化的技术。

请注意,拥有与DA通信的WSA是被商店应用程序认证要求明确禁止的

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

…但它只限制了"地方机制"。所以我想我们可以建立一个网络服务来路由通信。

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

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

checknetisolay .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沙箱。它仍然需要某种"社会工程"或直接指导来安装服务,但无论如何,这是可能的。我不确定,但认证规则关于"本地服务"通信时,添加这样的应用程序到Windows商店。

样本这里

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

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

用户被重定向到网页,从那里用户可以下载包含"PC浏览器"后端服务的经典桌面安装程序,用于访问用户整个PC上的文件。一旦安装了这个桌面服务,Metro应用程序就可以检测到它,并使用它来浏览整个PC。用户很高兴,但是WinRT沙箱被破坏了。

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

也许我错过了这一点,但是当激活专用网络功能时,我可以使用本地IP地址(不是本地主机)连接到本地运行的(http)服务器。这就实现了我的场景:一个winrt应用程序与一个wpf桌面应用程序

通信。