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

qmelpv7a  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(147)

我想使用我的MAUI应用在它运行的平台上启动一个单独的后台服务。当MAUI应用本身不运行时,这个后台服务利用gRPC从服务器接收数据。我知道它高度依赖于平台,所以为了讨论起见,让我们假设我们只在Windows上做这个。
我的策略是将后台服务.exe包含在用于在计算机上安装应用程序的.MSIX中,只需将.exe添加到Platform/Windows文件夹中,以便它与应用程序一起部署。但是,我无法使用C#找到该.exe文件的位置。WPF有一个“特殊”文件夹,可以将我引导到任何系统上的Program Files文件夹,然后C#将该.exe作为Windows服务启动。我找不到MAUI的等效项,因为MAUI的FileSystem类不允许这样做。
也许我的策略不是正确的。如果不是这个,那么用MAUI应用程序部署后台服务的好策略是什么呢?
谢谢你!

llew8vvj

llew8vvj1#

首先:
我知道它高度依赖于平台,
是这样的,但是,令人惊讶的是......
可以添加在安装MSIX时也已安装的Windows服务。
首先,您需要在解决方案中添加一个项目,因为Maui应用程序在本机运行时会遇到很多问题。因此,假设您有另一个使用net6.0控制台应用程序模板的项目。然后添加一个main函数,如下所示:

// 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
            }
        }
    }
}

确保将启动对象设置为AppService.Program
现在,将添加的项目作为项目引用添加到MAUI项目中。
Maui要求所有添加的项目都是自包含的,因此您需要将其添加到AppService项目的csproj中。

<SelfContained>True</SelfContained>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>

现在,为了确保服务已安装,您需要向Package.appxmanifest添加一些说明。此文件位于Maui平台特定文件夹中。
将命名空间添加到Package元素:

xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"

将服务详细信息添加到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>

将所需的功能添加到Capabilities元素:

<Capabilities>
    <rescap:Capability Name="runFullTrust" />
    <rescap:Capability Name="allowElevation" />
    <rescap:Capability Name="packagedServices" />
    <rescap:Capability Name="localSystemServices" />
  </Capabilities>

就是这样。

相关问题