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

时间:2011-09-19 00:59:10

标签: c# wpf winapi windows-8 windows-runtime

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

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

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

  

根据Martyn Lovell的说法,没有任何故意的机制   那些,可以用于它的一些是有意限制的。   例如,命名管道不在那里,也不是内存映射文件。   有插座(包括服务器套接字),但连接时   localhost,您只能连接到同一个应用程序。你可以正常使用   其中一个共享的“已知文件夹”(文档,图片等)中的文件,   但这是一个相当粗糙的黑客,需要进行民意调查   对用户可见。 - Pavel Minaev评论this issue

因此,正常的方法失败我正在考虑使用Web服务或读/写数据库以便进行某种形式的通信,当这些进程在同一台机器上运行时,这两种方式似乎都有点过分。

我在这里尝试是否有意义?我可以看到Metro应用程序需要成为桌面上运行的现有服务的前端UI。或者将WPF用于桌面上运行的前端UI(即非城域应用程序)更好。

8 个答案:

答案 0 :(得分:54)

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

This post描述了支持的功能。

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

另请注意,您无法在Metro中使用同步WCF。您将不得不使用基于Task的包装器,它只是异步的。

谢谢你的提问。我是我的好起点:)

答案 1 :(得分:38)

在我参加的//构建/会话结束时,有很多这样的问题。执行其中一次大型会议的执行官阿莱什·霍尔切克(AlešHoleček)走出了观众席来处理他们。即使您不是C ++开发人员,也要下载该会话并观看Q& A. http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

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

答案 2 :(得分:11)

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

Brokered Windows Runtime Components for side-loaded Windows Store apps

引用:

  

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

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

答案 3 :(得分:5)

关于如何使用协议处理程序构建松散耦合的Metro应用程序,article上有一个InfoQ。这是Windows长期以来支持的东西,人们可以预见桌面应用程序将自己注册为协议处理程序,也许metro应用程序可以通过这种机制进行通信。

我不知道这是否可能,但结账可能会很有趣。

答案 4 :(得分:3)

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

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

CheckRIsolation.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-

答案 5 :(得分:3)

Christophe Nasarre blogged关于使用本地文件这样做的相当愚蠢的方法。结果是桌面app / windows商店应用程序(在博客中称为DA / WSA)之间的通信,而无需在两个应用程序的UI之间切换。他还在博客上发表了另一篇涉及协议处理程序的不太苛刻的技术。

请注意,商店App certification requirements 明确禁止与DA通信的WSA

  

Windows应用商店应用不得通过本地机制与本地桌面应用或服务进行通信,包括通过文件和注册表项。

......但它仅限制“本地机制”。所以我想我可以构建一个用于路由通信的Web服务。

答案 6 :(得分:2)

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

Sample here

  

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

     

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

     

用户被重定向到网页,用户可以从该网页下载包含“PC浏览器”后端服务的经典桌面安装程序,用于访问用户整个PC上的文件。安装此桌面服务后,Metro应用程序可以检测到它并使用它来浏览整个PC。用户很高兴,但WinRT沙箱受到了损害。

     

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

答案 7 :(得分:0)

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