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

在使用适用于Windows 8的新Metro风格构buildUI前端的情况下,希望它与在同一本地计算机(例如,Windows服务应用程序)上的桌面上运行的.NET应用程序进行通信。

metro应用程序和桌面应用程序之间可以使用哪种forms的进程间通信?

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

根据马丁·洛维尔(Martyn Lovell)的说法,没有任何有意的机制,有些可以用来作为它的意图受到限制。 命名pipe道不在那里,例如,也不是内存映射文件。 有套接字(包括服务器套接字),但连接到本地主机时,只能连接到同一个应用程序。 你可以在共​​享的“已知文件夹”(文件,图片等)之一中使用正常的文件,但这是一个相当粗糙的黑客需要轮询,并为用户可见。 – 帕维尔米纳夫评论这个问题

因此,如果没有正常的方法,我正在考虑使用Web服务或读取/写入数据库,以便获得某种forms的通信,当进程在同一台计算机上运行时,这两种方式似乎都是过度的。

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

我正在将现有的项目移植到Win8。 它由通过NamedPipes WCF相互通话的Windows服务和托盘应用程序组成。 正如你可能已经知道Metro不支持命名pipe道。 我结束了使用TcpBinding全双工连接。

这篇文章描述了哪些function是支持的。

Metro客户端可以使用的WCF服务器示例在这里

另外请记住,您不能在Metro中使用同步WCF。 你将不得不使用只是asynchronous的基于任务的包装。

并感谢你的问题。 我是我的好起点:)

在我参加的一个培训/会议结束时,有一些类似的问题。 谁做了一个大的图片会议的执行官AlešHoleček,出现在观众处理他们。 即使您不是C ++开发人员,也可以下载该会话并观看Q&A http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Metro应用程序不能指望安装在机器上的桌面应用程序或服务。 桌面应用程序无法依靠Metro应用程序运行,因为它们可以随时暂停。 你需要开始思考不同。 听这个Aleš。

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

为侧装式Windowsapp store应用程序分发了Windows运行时组件

去引用:

认识到关键的业务function和规则体现在现有的软件资产中,并且企业有各种各样的情况,新的应用程序风格将产生高度的生产力,Windows 8.1 Update包括一个名为Brokered Windows Runtime Components的新function,应用。 我们使用术语IPC(进程间通信)来描述在Windows应用程序中与此代码交互的同时在一个进程(桌面组件)中运行现有桌面软件资产的能力。 这是企业开发人员熟悉的模式,因为数据库应用程序和在Windows中使用NT服务的应用程序共享一个类似的多进程架构。

尽pipe最初实施这种方法在复杂方面稍微有些落后,但它允许跨Windows Store和桌面组件进行深度集成。 请记住,目前它不会通过公共的Windowsapp storeauthentication。

InfoQ上有一篇关于如何使用协议处理程序构build松耦合的Metro应用程序的文章。 这是Windows已经支持了很长一段时间,可以预见到一个桌面应用程序注册自己作为协议处理程序,也许地铁应用程序可以通过这种机制进行通信。

我不知道这是否可能,但它可能是有趣的检查。

Christophe Nasarre曾经使用本地文件来博客介绍一种非常冒险的方式。 结果是桌面应用程序/ windows store应用程序(在博客中称为DA / WSA)之间的通信,而不必在两个应用程序的UI之间切换。 他还发表了另一个涉及协议处理程序的较less黑客技巧。

请注意,具有与DA通信的WSA 明确地被商店Appauthentication要求 禁止

Windows Store应用程序不得通过本地机制(包括通过文件和registry项)与本地桌面应用程序或服务进行通信。

但是它只限制“地方机制”。 所以我想可以build立一个Web服务来路由通信。

如果您认为可以进行额外的手动cmd操作,则可以尝试:

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

CheckNetIsolation.exe包含在winRT安装中,所以没有额外的安装。

我试过了:即使在更新包之后,它也能正常工作。

如图所示: http : //msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

在这里解释了如何find你的app的packageID: http ://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- 在-APPID-的-A-Metro风格-APP-

可以使用本地服务在Metro应用程序到桌面应用程序的同一台计算机上进行通信。 我前段时间实现了简单的“概念validation”,如何绕过使用本地服务的WinRT沙箱。 它仍然需要某种“社会工程”或直接指导安装服务,但无论如何,这是可能的。
我不确定在将应用程序添加到Windowsapp store时,有关“本地服务”通信的authentication规则。

在这里示例

通过deviseMetro应用程序不能直接访问底层PC,只能使用WinRT API和可用function。 但是,当您创build后台服务来访问PC和所有数据时,它基本上不再在沙箱中运行。

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

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

当然这不适用于Windows 8 ARM平板电脑。 使用此解决方法,甚至可以为经典桌面应用程序(如防病毒,洪stream/ P2P客户端等)构buildMetro应用程序客户端。

也许我错过了这一点,但是当激活专用networkingfunction时,我可以使用本地IP地址(不是本地主机)连接到本地运行(http)服务器。 这使我的情况下,一个Windows应用程序与WPF桌面应用程序通信