120

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

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

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

根据 Martyn Lovell 的说法,没有任何刻意的机制来实现这一点,并且一些可以用于它的机制是有意限制的。例如,命名管道不存在,内存映射文件也不存在。有socket(包括服务器socket),但是连接localhost时,只能连接同一个app。您可以在共享的“已知文件夹”(文档、图片等)之一中使用普通文件,但这是一种相当粗暴的 hack,需要轮询并且对用户可见。-- Pavel Minaev评论这个问题

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

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

4

8 回答 8

54

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

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

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

另请记住,您不能在 Metro 中使用同步 WCF。您必须使用基于Task的包装器,它只是异步的。

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

于 2012-02-21T07:28:10.970 回答
38

在我参加的 //build/ 会议结束时有很多这样的问题。Aleš Holeček 是负责其中一场大场面会议的执行官,他从观众席中走出来处理这些问题。即使您不是 C++ 开发人员,也请下载该会话并观看问答。http: //channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

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

于 2011-09-19T02:51:05.540 回答
11

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

用于旁加载的 Windows 应用商店应用的代理 Windows 运行时组件

去引用:

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

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

于 2014-08-25T12:50:51.380 回答
5

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

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

于 2011-09-21T08:41:47.077 回答
3

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

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

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

...但它仅限制“本地机制”。所以我想人们可以建立一个网络服务来路由通信。

于 2013-10-22T07:31:47.263 回答
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- the-appid-of-a-metro-style-app-

于 2013-08-02T22:10:51.723 回答
2

It is possible to communicate on the same machine from Metro app to desktop app using local service. I've implemented some time ago simple "proof of concept", how to bypass the WinRT sandbox using local service. It still needs some kind of "social engineering" or direct guide for installing the service, but anyway, it is possible.
I'm not sure though about the certification rules about "local service" communication when adding such app to Windows Store.

Sample here

By design Metro application cannot access underlying PC directly, only using WinRT API and available capabilities. But when you create back-end service for accessing the PC and all data there, it's basically no longer running in sandbox.

The only "problem" is that user must manually install this back-end service, but that won't be a problem using some "social engineering": User downloads "PC browser" Metro app, user can browse all pictures, music and videos, using WinRT API, but the app also shows message at the bottom: "Download our PC browser powerpack and browse your entire PC, for FREE"

User is redirected to web page, from where user can download classic desktop installer containing "PC browser" back-end service for accessing files on users entire PC. Once this desktop service is installed, the Metro app can detect it and use it for browsing the entire PC. User is happy, but the WinRT sandbox is compromised.

Of course this won't work on Windows 8 ARM tablets. Using this workaround it could be even possible to build Metro app clients for classic desktop apps like antiviruses, torrent/P2P clients, etc.

于 2012-10-01T17:02:38.983 回答
0

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

于 2015-10-25T12:18:41.593 回答