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

C# Windows 8中的Metro应用程序如何与同一台计算机上的后端桌面应用程序通信?,c#,wpf,winapi,windows-8,windows-runtime,C#,Wpf,Winapi,Windows 8,Windows Runtime,如果您的UI前端是使用新的Metro风格的windows 8应用程序构建的,并且希望它与在同一台本地计算机上的桌面上运行的.NET应用程序(例如windows服务应用程序)进行通信 metro应用程序和桌面应用程序之间有什么形式的进程间通信 感谢Visual Studio团队的Pavel Minaev,他在评论中提供了一些初步信息,引用如下: 根据Martyn Lovell的说法,没有任何刻意的机制 这一点,以及一些可以用于它的是故意限制。 例如,命名管道不存在,内存映射文件也不存在。 存在套接

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

metro应用程序和桌面应用程序之间有什么形式的进程间通信

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

根据Martyn Lovell的说法,没有任何刻意的机制 这一点,以及一些可以用于它的是故意限制。 例如,命名管道不存在,内存映射文件也不存在。 存在套接字(包括服务器套接字),但在连接到时 localhost,您只能连接到同一个应用程序。你可以用普通的 共享“已知文件夹”(文档、图片等)中的文件, 但这是一个相当粗糙的黑客行为,必须进行投票,而且是 对用户可见。-评论

因此,如果无法采用正常的方法,我会考虑使用web服务或对数据库进行读/写操作,以实现某种形式的通信,当进程在同一台机器上运行时,这两种方法似乎都有些过头了


我在这里尝试的有意义吗?我认为有必要将metro应用程序作为桌面上运行的现有服务的前端UI。或者对桌面上运行的前端UI(即非metro应用程序)使用WPF更好。

在我参加的//构建/课程结束时,有许多类似的问题。做了一次重要会议的执行官阿莱什·霍尔切克(AlešHoleček)从观众中走出来处理这些问题。即使你不是C++开发者,也要下载这个会话并观看Q&A

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

有一个关于如何使用协议处理程序构建松散耦合的Metro应用程序的讨论。这是Windows长期以来一直支持的功能,可以预见桌面应用程序将自己注册为协议处理程序,并且metro应用程序可能可以通过这种机制进行通信


我不知道这是否可行,但我想签出它可能会很有趣。

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

描述支持哪些功能

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

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


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

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

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

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

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

当然,这在Windows8ARM平板电脑上不起作用。使用此解决方案,甚至可以为antiviruses、torrent/P2P客户端等经典桌面应用构建Metro应用客户端


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

X:/> CheckNetIsolation.exe LoopbackExempt –a –n=<packageID>;
X:/>CheckNetIsolation.exe loopbackexcept–a–n=;
winRT安装中包含CheckNetIsolation.exe,因此不需要额外安装

我试过了:它很有效,即使在包更新之后

如图所示:

这里介绍了如何查找应用程序的packageID:

克里斯托夫·纳萨雷(Christophe Nasarre)介绍了一种使用本地文件的相当黑客的方法。结果是桌面应用程序/windows应用商店应用程序(在博客中称为DA/WSA)之间的通信,而不必在两个应用程序的UI之间切换。他还在博客中提到了另一种涉及协议处理程序的不太黑客的技术

请注意,商店明确禁止使用与DA通信的WSA

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


。。。但它只限制“地方机制”。因此,我想人们可以构建一个web服务来路由通信。

请注意,使用Windows 8.1更新,Windows存储之间的通信