【问题标题】:Running/Launching a Separate Background Service from a MAUI App从 MAUI 应用程序运行/启动单独的后台服务
【发布时间】:2022-08-24 19:09:29
【问题描述】:

我想使用我的 MAUI 应用程序在它运行的平台上启动一个单独的后台服务。当 MAUI 应用程序本身未运行时,此后台服务使用 gRPC 从服务器接收数据。我知道它高度依赖于平台,所以为了争论,让我们假设我们只在 Windows 上执行此操作。

我的策略是将后台服务 .exe 与用于在计算机上安装应用程序的 .MSIX 一起包含,只需将 .exe 添加到 Platform/Windows 文件夹,以便它与应用程序一起部署。但是,我无法使用 C# 找出该 .exe 文件的位置。 WPF 有一个 \"special\" 文件夹,可以将我定向到任何系统上的 Program Files 文件夹,然后 C# 会将该 .exe 作为 Windows 服务启动。我找不到 MAUI 的等价物,因为 MAUI 的 FileSystem 类不允许这样做。

也许我的策略不正确。如果不是这个,使用 MAUI 应用程序部署后台服务的好策略是什么?

谢谢!

  • @DanFriedman 感谢您的回复。不完全——问题在于能够在与应用程序相同的目录中找到并启动 .exe 文件,或者启动即使在应用程序关闭时也能正常工作的后台服务。
  • 澄清一下,我的想法是,如果您可以使用 WPF 来做到这一点,那么也许能够使用特定于平台的代码可能允许您访问您需要的 API(在 MAUI 的文件系统之外)。对不起,如果它没有帮助,我还没有尝试过。
  • 可以理解,尽管 MAUI 应用程序安装在不同的目录中,即使具有提升的权限,该目录也会锁定给最终用户。因此,即使我可以使用特定于平台的代码,它也可能不会让我访问后台服务的 .exe。

标签: c# .net grpc maui maui-windows


【解决方案1】:

首先:

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

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

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

现在要确保已安装服务,您需要向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>

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多