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


120

如果您具有使用Windows 8的Metro新应用程序构建的UI前端,并且希望它与运行在同一本地计算机上的桌面上的.NET应用程序(例如Windows服务应用程序)进行通信,则这种情况。

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

感谢Visual Studio团队的Pavel Minaev,他在此处的注释中提供了一些初始信息,并引用了:

根据马丁·洛夫(Martyn Lovell)的说法,没有任何故意的机制,有意使用的机制受到有意限制。例如,命名管道不存在,内存映射文件也不存在。有套接字(包括服务器套接字),但是当连接到本地主机时,只能连接到同一应用程序。您可以在共享的“已知文件夹”之一中使用普通文件(“文档”,“图片”等),但这是一个相当粗糙的技巧,需要轮询并且对用户可见。- 帕维尔Minaev评论这个问题

因此,如果无法使用常规方法,我会考虑使用Web服务或对数据库进行读/写操作,以实现某种形式的通信,而当进程在同一台计算机上运行时,这两种方法似乎都显得过分了。

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


2
本地WCF服务呢?
Gleno

2
@Gleno在问题中将涉及“使用Web服务的思考”。就是说,我确实想知道它是否还会工作-如果.NET Core中提供的WCF客户端库的实现是基于WinRT套接字构建的,那么大概会应用相同的“无本地主机”限制。这需要检查。
帕维尔米纳夫2011年

1
由于Metro的限制,WCF的NetNamedPipeBinding和NetTcpBinding(通过localhost)似乎无法使用。那会留下Web服务或MSMQ绑定吗?老实说,我不确定WCF本身是否可以在Metro中使用。
dodgy_coder 2011年

6
让我转过来问您一个问题:如果不存在与您通信的桌面服务,那会发生什么?请记住,您的应用程序只能从商店中安装,因此不能依赖桌面服务的存在。
恢复莫妮卡·拉里·奥斯特曼

3
看来企业可以减轻自定义应用程序的负担,并绕过Windows应用商店。如果是这样,您可以假设某些应用程序正在企业环境中运行。就是说,我认为原始发布者应出于其目的使用桌面WPF前端。
Ankur Goel

Answers:


54

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

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

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

另外请记住,您不能在Metro中使用同步WCF。您将必须使用仅基于异步的基于任务的包装器。

并感谢您的提问。我对我来说是个好起点:)


7
谢谢你……这是一个很大的帮助。很高兴看到一个切实可行的答案,而不仅仅是被告知不应该/不能完成。
dodgy_coder

1
这可能是一个愚蠢的问题...但是您是否可以使用示例连接到本地主机?链接到的问题显示了Visual Studio的内部结构(我从路径中推导出来,但是如果我错了,请更正我)。WCF(与localhost结合使用)是否可以在WCF之外工作?
dzendras

1
@dzendras当然可以。它也将与localhost一起工作。
专家

3
我怀疑这样的应用程序会通过商店认证。
阿妮2012年

6
如果有这条规则,我想可以引述为“ 3.9所有应用程序逻辑都必须源自您的应用程序包并驻留在您的应用程序包中。您的应用程序不得尝试通过任何形式的动态代码或其他方式更改或扩展打包的内容。更改应用程序与Windows运行时交互或在存储策略方面的行为的数据。例如,不允许下载远程脚本并随后在应用程序包的本地上下文中执行该脚本。
阿妮2012年

38

在我参加的// build /会议结束时,有许多类似的问题。参加过其中一场大型活动的执行官AlešHoleček从观众中脱颖而出以进行处理。即使您不是C ++开发人员,也请下载该会话并观看问答。http: //channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Metro应用无法依靠计算机上安装的桌面应用或服务。桌面应用程序无法依靠Metro应用程序运行,因为它们可以随时挂起。您需要开始不同的思考。在此听Aleš。


6
视频中似乎在47:20提出了这个确切的问题。
帕维尔·米纳夫2011年

3
...还有55:00。总体而言,答案似乎是“不,你不能那样做”。
Pavel Minaev 2011年

1
@dodgy_coder我不确定WCF / TCP(或HTTP)是否可以在同一台机器上运行。如果沙盒不允许您localhost直接通过TCP套接字连接,为什么要让它通过WCF进行连接?
Pavel Minaev 2011年

2
有趣的是,内置了通过共享合同在两个Metro应用之间进行通信的支持,但这似乎与剪贴板类似,并且用于从源应用到目标应用的单向传输,而不是实现两个双向通信协议。
dodgy_coder

4
在我看来,根据已安装的桌面应用程序或服务,侧面加载的LOB Metro应用程序将没有问题。我很难相信不会支持这种非常实际的方案。借助Silverlight,我们看到了桌面/本机互操作功能的逐步增加...我很确定这些情况下的某些功能(命名管道,内存映射文件或其他...)将受到支持(带有指导文档)在将来。
David Cuccia 2012年

11

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

适用于侧面加载的Windows Store应用程序的Brokered Windows运行时组件

报价:

Windows 8.1 Update认识到关键的业务功能和规则已包含在现有软件资产中,并且企业具有各种情况,对于这些情况,新的应用程序样式将具有很高的生产力,因此Windows 8.1 Update包括一项称为Brokered Windows Runtime Components的新功能,可侧加载应用程序。我们使用IPC(进程间通信)一词来描述在Windows Store应用程序中与此代码进行交互时在一个进程(桌面组件)中运行现有桌面软件资产的能力。这是企业开发人员熟悉的模型,因为数据库应用程序和Windows中使用NT服务的应用程序共享类似的多进程体系结构。

尽管实施此方法最初在复杂方面有点,但它允许在Windows Store和桌面组件之间进行深度集成。只需记住,它暂时不会通过公共Windows Store认证。


5

InfoQ上有一篇文章,介绍如何使用协议处理程序构建松耦合的Metro应用。Windows已经支持了很长一段时间,并且可以预见桌面应用程序将自己注册为协议处理程序,并且Metro应用程序可以通过这种机制进行通信。

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


文章说:“您可以在Metro中做到这一点[跳转到另一个应用程序中的另一个工作流-因为您的应用程序本来应该很小并且专注于],这是通过利用协议来实现的。对于我们上面的示例,该协议看起来像“ acme-stock-purchase:// client = 123&stock = XYZ”。” -从技术上讲,这是什么意思?
Lumi

这种方法的问题在于,它只是一种通信方式。
专家

3

Christophe Nasarre在博客上发表了一篇关于使用本地文件进行操作的小技巧。结果是桌面应用程序/ Windows商店应用程序之间的通信(在博客中称为DA / WSA),而无需在两个应用程序的UI之间切换。他还写了一篇关于协议处理程序的不那么骇人的技术的博客。

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

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

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


3

如果您认为可以进行其他手动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-get- 一个地铁风格的应用程序


我希望能够与本地应用程序的本地主机通信,并且只能使用此命令在不运行VS的计算机上使它发生。
adosaiguas 2014年

2

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

在这里取样

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

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

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

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


3
不确定为什么需要提及社会工程...由于最初的问题是谈论与Metro应用程序对话的桌面应用程序/服务,因此预计用户将需要单独安装桌面应用程序/服务。那么,您在桌面服务和Metro应用之间使用了哪种通信方式?
dodgy_coder 2012年

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.