UWP 应用与 Windows 服务的通信

UWP App Communication with Windows Service

我们正在着手重新设计一个应用程序,并且正在讨论是否可以使用 UWP 而不是普通的 WPF 应用程序。

我们的应用程序需要能够访问整个文件系统和所有系统资源。这是一个问题,因为 UWP 应用是沙盒化的。但是,我们试图通过尝试以这种方式处理它来绕过该问题:

我们可以在 WPF 中简单地执行此操作,但我们想使用 UWP 以利用一些新的 Windows WPF 缺少的 10 个核心功能,例如动态磁贴和 Cortana。

您觉得我们的做法可行吗?我们的不确定性之一是我们如何让 UWP 应用程序与 Windows 服务进行通信 - 我们已经研究过 SignalR 和 Desktop Bridge 之类的东西,但不确定哪种方法可能是我们场景的最佳方法。

谢谢!

Do you think our approach is feasible?

我们无法在 UWP 应用中直接使用 Windows 服务。为了在 Win32 应用程序和 UWP 应用程序之间建立 IPC,在这里可能有帮助的是使用新功能 <rescap:Capability Name="runFullTrust" />,它使由 FullTrustProcessLauncher API 启动的 Win32 应用程序能够实现上层应用程序安全上下文以使用 WinRT APIs。但是正如您在这里看到的 rescap,这意味着此 UWP 应用程序无法在商店中发布。

你可以参考官方AppService Bridge Sample. You can try to firstly create a traditional desktop app which consume App service(它可以与WPF和UWP应用程序通信,而不是传统的Windows服务)并使用WinRT APIs,构建这个应用程序后(不要 运行 它),将生成一个 .exe 文件。但是这个应用程序不能 运行 因为它使用 WinRT API,那么你可以创建你的 UWP 应用程序来使这个桌面应用程序可执行。

we've looked into things like SignalR and the Desktop Bridge but are unsure which may be the best approach for our scenario.

所以我认为桌面桥可能是最好的方法。

你可以查看我的示例代码: https://github.com/manupstairs/UWPWithWCFSample

我认为 WCF 是正确的答案。

对于双面绑定,勾选这个: https://github.com/manupstairs/UWPwithDuplexWCF

向 MS Store 提交一个 APPX 又近了一步。您需要桌面桥技术。控制台中的 UWP UI 部分和 WCF 服务主机。我们可以将它们组合成一个 APPX。

能力"runFullTrust"是必要的。 https://developer.microsoft.com/en-us/windows/bridges/desktop/

我刚刚为 UWP 和 .Net Framework 之间的 IPC 创建了一个库 Windows 通过共享内存服务。无需使用 Full Trust 功能或配置网络环回规则。当您创建共享对象时,只需显式设置访问规则并将您的 UWP 应用程序添加到 ACL,它将能够打开由 Windows 服务创建的全局命名的 Mutex/Semaphore/Event 和内存映射文件。

GitHub repository with source code, tools and samples

Nuget package