【问题标题】:How can a Metro app in Windows 8 communicate with a backend desktop app on the same machine?Windows 8 中的 Metro 应用程序如何与同一台计算机上的后端桌面应用程序通信?
【发布时间】:2011-11-19 21:35:45
【问题描述】:

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

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

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

根据 Martyn Lovell 的说法,没有任何刻意的机制 那,以及一些可以用于它的东西是故意限制的。 例如,命名管道不存在,内存映射文件也不存在。 有套接字(包括服务器套接字),但是当连接到 localhost,您只能连接到同一个应用程序。你可以正常使用 共享“已知文件夹”之一(文档、图片等)中的文件, 但这是一个相当粗暴的 hack,需要轮询并且是 对用户可见。 -- Pavel Minaev评论this issue

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

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

【问题讨论】:

  • 本地 WCF 服务怎么样?
  • @Gleno 将在问题中涉及“考虑使用 Web 服务”。也就是说,我确实想知道它是否会起作用 - 如果 .NET Core 中提供的 WCF 客户端库的实现是建立在 WinRT 套接字之上的,那么大概会应用相同的“无 localhost”限制。这需要检查。
  • 由于 Metro 的限制,看起来 WCF 的 NetNamedPipeBinding 和 NetTcpBinding(通过 localhost)无论如何都不可用。那会留下 Web 服务或 MSMQ 绑定吗?老实说,我不确定 WCF 本身是否可以在 Metro 中使用。
  • 让我把你的问题转过来问你:如果你正在与之通信的桌面服务不存在会怎样?请记住,您的应用程序只能从商店安装,因此它不能依赖桌面服务的存在。
  • 企业似乎可以旁加载自定义应用程序并绕过 Windows 应用商店。如果是这样,那么您可以假设某些应用程序在企业环境中运行是有道理的。也就是说,我认为原始发帖人应该为他的目的使用桌面 WPF 前端。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    请注意,在 Windows 8.1 更新中,Windows Store 应用程序和用 C# 为 .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 应用商店和桌面组件进行深度集成。请记住,它暂时不会通过公共 Windows 应用商店认证。

    【讨论】:

      【解决方案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-

      【讨论】:

      • 我希望能够与 localhost 进行内部应用程序通信,但我只能在未使用此命令运行 VS 的计算机上实现。
      【解决方案4】:

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

      请注意,商店App certification requirements

      明确禁止拥有与 DA 通信的 WSA

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

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

      【讨论】:

        【解决方案5】:

        可以在同一台机器上使用本地服务从 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 应用程序客户端。

        【讨论】:

        • 不知道为什么你需要提到社会工程......因为最初的问题是关于桌面应用程序/服务与地铁应用程序的对话,预计用户将需要安装桌面应用程序/服务分开。那么您在桌面服务和 Metro 应用程序之间使用了哪种通信方式?
        【解决方案6】:

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

        This post 描述了支持的功能。

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

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

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

        【讨论】:

        • 感谢您的帮助...帮助很大。很高兴看到一个实际的答案,而不是仅仅被告知不应该/不能这样做。
        • 这可能是一个愚蠢的问题...但是您可以使用您的示例连接到本地主机吗?您链接到的问题显示了 Visual Studio 的内部结构(我是从路径中推断出来的,但如果我错了,请纠正我)。 WCF(与 localhost 结合)是否在 WCF 之外工作?
        • @dzendras 当然可以。它也适用于 localhost。
        • 不过,我怀疑这样的应用能否通过商店认证。
        • 如果这是我认为可能被引用的规则 "3.9 所有应用程序逻辑必须源自并驻留在您的应用程序包中 您的应用程序不得尝试更改或扩展通过任何形式的动态包含代码或数据来打包内容,这些代码或数据会更改应用程序与 Windows 运行时的交互方式,或在存储策略方面的行为。例如,不允许下载远程脚本并随后在其中执行该脚本您的应用程序包的本地上下文。”
        【解决方案7】:

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

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

        【讨论】:

        • 这篇文章说:“在 Metro [跳转到不同应用程序中的另一个工作流 - 因为你的应用程序是小型且高度集中的] 中执行此操作的方式是利用协议。对于我们在协议上面的示例可能看起来像“acme-stock-purchase://client=123&stock=XYZ”。 - 从技术上讲,“利用协议”是什么意思?
        • 这种方法的问题在于它只是一种通信方式。
        【解决方案8】:

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

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

        【讨论】:

        • 这个确切的问题似乎是在视频中的 47:20 提出的。
        • ... 以及 55:00 的另一个。一般来说,答案似乎是“不,你不能那样做”。
        • @dodgy_coder 我不确定 WCF/TCP(或 HTTP)是否可以在同一台机器上工作。如果沙盒不允许您直接通过 TCP 套接字连接到 localhost,为什么它会让您通过 WCF 做同样的事情?
        • 有趣的是,内置支持通过 share contracts 在两个 Metro 应用程序之间进行通信,但这似乎与剪贴板的用法相似,并且用于从源应用程序单向传输到目标应用程序,而不是用于实现双向通信协议。
        • 在我看来,侧载 LOB Metro 应用程序不会有任何问题,具体取决于已安装的桌面应用程序或服务。我很难相信这种非常实际的场景不会得到支持。使用 Silverlight,我们看到桌面/本机互操作功能逐渐增加......我很确定这些场景中的某些东西(命名管道、内存映射文件或其他东西......)将得到支持(带有指导文档)未来。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        相关资源
        最近更新 更多