从 MAUI 应用程序运行/启动单独的后台服务

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 应用程序部署后台服务的好策略是什么?

谢谢!

Fun*_*nly 5

首先:

我知道它高度依赖于平台,

情况确实如此,但令人惊讶的是......

可以添加在安装 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)

就是这样。