在没有 App 打包项目的情况下,在 Side-loaded UWP 和 Console App 之间使用 App Service
Using App Service between Side-loaded UWP and Console App without App packaging project
我有一个企业 LOB 场景,我需要在我的侧载 UWP 应用程序和第三方开发的多个控制台应用程序之间进行通信。在内部,这些控制台应用程序将与 COM 端口和硬件设备连接。
我可以使用应用服务在 UWP 和未打包的控制台应用之间进行通信吗?
此外,通信必须是双向和异步的,预期流程:
- UWP -start-console-app-expect-no-response-> Console App(没有桌面如何实现这一步-桥?)
- UWP <-send-data-expect-no-response- 控制台应用程序
- UWP -send-data-expect-no-response-> 控制台应用程序
我已经提到了下面的链接,但根据它们 "Windows Application Packaging Project" 是必须的。
如果还有其他选择,请提出建议。
编辑:
可以使用 2 种方法从 UWP 启动包外控制台应用程序:
- 创建一个包含可以启动任何其他控制台应用程序的控制台应用程序的程序包。参考:
- 通过协议 URI 启动控制台应用程序。为控制台应用程序创建 URI 协议:https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914%28v%3dvs.85%29 OR https://www.meziantou.net/registering-an-application-to-a-uri-scheme-using-net.htm
但是,无法通过App Service在包外的Console App和UWP之间进行通信。尽管如此,控制台应用程序引用了 Microsoft.Windows.SDK.Contracts nuget 包并且可以访问 AppServiceConnection API,因为 AppServiceConnection class 具有 DualApiPartitionAttribute。无法建立连接,出现 AppServiceUnavailable 错误。
因此,现在我正在尝试使用上面提到的选项 1 的新解决方案:https://docs.microsoft.com/answers/questions/1166/how-uwp-can-communicate-with-windows-service.html?childToView=1211#answer-1211
需要调查的回退选项:
- WCFHttp/NamedPipes
- UWP启动Console App,Console App响应调用一个Launch by URI协议(当然UWP需要注册协议)
AppServiceConnection 不能用于在包外控制台应用程序和 UWP 之间建立通信,请参阅更新的问题。
看评论,我觉得这个是可以实现的,不过应该不是通过COM口,而是要建立AppServiceConnection
.
请参考this document为UWP应用创建AppService
。如果您的控制台应用程序可以创建 AppServiceConnection
,那么您可以与 UWP 应用程序建立连接并传输数据。
AppServiceConnection
是双向通信。建立连接后,控制台应用程序和UWP应用程序可以相互发送信息。
我终于完成了涉及的许多解决方法,但我仍在寻找更好的解决方案。我的 LOB 场景是一种特殊情况(参考问题)并且对我来说工作正常但对于其他人我不推荐这个解决方案。
解决方案的限制条件:
- 应用程序需要旁加载,因为它使用受限责任 (runFullTrust)
- 第三方exe要使用Launcher.LaunchUriAsync,需要导入Microsoft.Windows.SDK.Contracts nuget包(参考this and this)
- 通信,而不是应用程序到应用程序的启动当然只是一种方式:
- UWP 只是触发一个启动并传递参数
- 控制台应用也只能使用协议 URI 启动 UWP
- 第 3 方 .exe 名称和目录必须事先知道
- 作为解决方法,也可以使用协议启动 .exe,但这需要 .exe 来创建注册表项
- 自行处理超时和故障情况
我有一个企业 LOB 场景,我需要在我的侧载 UWP 应用程序和第三方开发的多个控制台应用程序之间进行通信。在内部,这些控制台应用程序将与 COM 端口和硬件设备连接。
我可以使用应用服务在 UWP 和未打包的控制台应用之间进行通信吗?
此外,通信必须是双向和异步的,预期流程:
- UWP -start-console-app-expect-no-response-> Console App(没有桌面如何实现这一步-桥?)
- UWP <-send-data-expect-no-response- 控制台应用程序
- UWP -send-data-expect-no-response-> 控制台应用程序
我已经提到了下面的链接,但根据它们 "Windows Application Packaging Project" 是必须的。
如果还有其他选择,请提出建议。
编辑:
可以使用 2 种方法从 UWP 启动包外控制台应用程序:
- 创建一个包含可以启动任何其他控制台应用程序的控制台应用程序的程序包。参考:
- 通过协议 URI 启动控制台应用程序。为控制台应用程序创建 URI 协议:https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914%28v%3dvs.85%29 OR https://www.meziantou.net/registering-an-application-to-a-uri-scheme-using-net.htm
但是,无法通过App Service在包外的Console App和UWP之间进行通信。尽管如此,控制台应用程序引用了 Microsoft.Windows.SDK.Contracts nuget 包并且可以访问 AppServiceConnection API,因为 AppServiceConnection class 具有 DualApiPartitionAttribute。无法建立连接,出现 AppServiceUnavailable 错误。
因此,现在我正在尝试使用上面提到的选项 1 的新解决方案:https://docs.microsoft.com/answers/questions/1166/how-uwp-can-communicate-with-windows-service.html?childToView=1211#answer-1211
需要调查的回退选项:
- WCFHttp/NamedPipes
- UWP启动Console App,Console App响应调用一个Launch by URI协议(当然UWP需要注册协议)
AppServiceConnection 不能用于在包外控制台应用程序和 UWP 之间建立通信,请参阅更新的问题。
看评论,我觉得这个是可以实现的,不过应该不是通过COM口,而是要建立AppServiceConnection
.
请参考this document为UWP应用创建AppService
。如果您的控制台应用程序可以创建 AppServiceConnection
,那么您可以与 UWP 应用程序建立连接并传输数据。
AppServiceConnection
是双向通信。建立连接后,控制台应用程序和UWP应用程序可以相互发送信息。
我终于完成了涉及的许多解决方法,但我仍在寻找更好的解决方案。我的 LOB 场景是一种特殊情况(参考问题)并且对我来说工作正常但对于其他人我不推荐这个解决方案。
解决方案的限制条件:
- 应用程序需要旁加载,因为它使用受限责任 (runFullTrust)
- 第三方exe要使用Launcher.LaunchUriAsync,需要导入Microsoft.Windows.SDK.Contracts nuget包(参考this and this)
- 通信,而不是应用程序到应用程序的启动当然只是一种方式:
- UWP 只是触发一个启动并传递参数
- 控制台应用也只能使用协议 URI 启动 UWP
- 第 3 方 .exe 名称和目录必须事先知道
- 作为解决方法,也可以使用协议启动 .exe,但这需要 .exe 来创建注册表项
- 自行处理超时和故障情况