The*_*Don 5 .net c# grpc maui maui-windows
我想使用我的 MAUI 应用程序在其运行的平台上启动单独的后台服务。当 MAUI 应用程序本身未运行时,此后台服务利用 gRPC 从服务器接收数据。我知道它高度依赖于平台,因此为了便于讨论,我们假设我们只在 Windows 上执行此操作。
我的策略是将后台服务 .exe 与用于在计算机上安装应用程序的 .MSIX 一起包含,只需将 .exe 添加到 Platform/Windows 文件夹中,以便它与应用程序一起部署。但是,我无法使用 C# 找出该 .exe 文件在哪里。WPF 有一个“特殊”文件夹,可将我引导至任何系统上的 Program Files 文件夹,然后 C# 会将该 .exe 作为 Windows 服务启动。我找不到 MAUI 的等效项,因为 MAUI 的 FileSystem 类不允许这样做。
也许我的策略不正确。如果不是这个,那么使用 MAUI 应用程序部署后台服务的好策略是什么?
谢谢!
首先:
我知道它高度依赖于平台,
情况确实如此,但令人惊讶的是......
可以添加在安装 MSIX 时也安装的 Windows 服务。
首先,您想要向您的解决方案添加一个项目,因为在撰写本文时,Maui 应用程序无法在没有一堆麻烦的情况下本地运行。假设您的另一个项目使用 net6.0 控制台应用程序模板。然后添加一个主函数,如下所示:
// See https://aka.ms/new-console-template for more information
using static System.Net.Mime.MediaTypeNames;
using System.Diagnostics;
namespace AppService
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
if (args[0] == "/service")
{
// Service logic
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
确保将启动对象设置为AppService.Program
现在将添加的项目添加为 MAUI 项目中的项目引用。
Maui 要求所有添加的项目都是独立的,因此您需要将其添加到 AppService 项目的 csproj 中。
<SelfContained>True</SelfContained>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
Run Code Online (Sandbox Code Playgroud)
现在,为了确保服务已安装,您需要向Package.appxmanifest. 该文件位于 Maui 平台特定文件夹中。
将命名空间添加到Package元素:
xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"
Run Code Online (Sandbox Code Playgroud)
将服务详细信息添加到Application元素中:
<Extensions>
<desktop6:Extension
Category="windows.service"
Executable="AppService.exe"
EntryPoint="AppService.Program">
<desktop6:Service
Name="AppManager"
StartupType="auto"
StartAccount="localSystem"
Arguments="/service"
>
</desktop6:Service>
</desktop6:Extension>
</Extensions>
Run Code Online (Sandbox Code Playgroud)
向元素添加所需的功能Capabilities:
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="allowElevation" />
<rescap:Capability Name="packagedServices" />
<rescap:Capability Name="localSystemServices" />
</Capabilities>
Run Code Online (Sandbox Code Playgroud)
就是这样。