it-swarm.cn

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

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

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

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

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

因此,我正在考虑使用Web服务或读取/写入数据库以便进行某种形式的通信,这两种方法在进程在同一台机器上运行时都显得过于苛刻。

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

118
dodgy_coder

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

本文 描述了支持的功能。

Metro客户端可以使用的WCF服务器样本是here

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

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

54
expert

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

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

38
Kate Gregory

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

为侧面加载的Windows应用商店应用程序打破了Windows运行时组件

报价:

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

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

11
ig2r

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

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

5
tronda

如果您认为可以进行额外的手动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-得到应用程序的地铁风格应用

3
fgalliat

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

请注意,拥有与DA通信的WSA是 明确禁止 由商店 App认证要求

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

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

3
twj

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

此处示例

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

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

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

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

2
Martin Suchan

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

0
Wendelin