【问题标题】:Start program on boot C# .Net 5 MacOS在启动 C# .Net 5 MacOS 时启动程序
【发布时间】:2021-05-06 19:56:38
【问题描述】:

我正在尝试添加一个程序以在启动时启动,并且我一直在广泛搜索,无法找到解决方案。

我已经很接近了,我设法生成了一个 .plist 文件并将其添加到 ~/Library/LaunchAgents,但是我似乎无法加载它。我没有收到以下代码的错误。

这是目前为止的代码:

public static void AddApplicationToStartup()
    {
        try
        {
            var filePath = Environment.GetEnvironmentVariable("HOME") + "/Library/LaunchAgents/teststart.plist";
            CreatePlistFile(filePath);

            //string test = $" -c \"osascript -e \' tell application \\\"Terminal\\\" to do script \\\"echo hello\\\" \' \"";
            var arguments = $" -c \"osascript -e \' do shell script \\\"sudo launchctl load -w {filePath}\\\" with administrator privileges\' \"";
            var command = "/bin/bash";

            Console.WriteLine($"Performing: {command} {arguments}");
            ProcessStartInfo procStartInfo = new ProcessStartInfo
            {
                FileName = command,
                Arguments = arguments
            };
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            procStartInfo.RedirectStandardError = true;
            procStartInfo.CreateNoWindow = true;

            // start process
            Process proc = new Process();
            proc.StartInfo = procStartInfo;
            proc.Start();
            proc.WaitForExit();


            // read process output
            string cmdError = proc.StandardError.ReadToEnd();
            Console.WriteLine($"cmdError: {cmdError}");
            string cmdOutput = proc.StandardOutput.ReadToEnd();
            Console.WriteLine($"cmdOutput: {cmdOutput}");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

private static void CreatePlistFile(string filePath)
    {
        try
        {
            if (!File.Exists(filePath))
            {
                PListWriter writer = new PListWriter(filePath, null);
                writer.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
                writer.WriteDocType();
                writer.WriteStartElement("plist");
                writer.WriteAttributeString("version", "1.0");
                writer.WriteStartElement("dict");
                writer.WriteElementString("key", "Label");
                writer.WriteElementString("string", "com.user.teststart");
                writer.WriteElementString("key", "ProgramArguments");
                writer.WriteStartElement("array");
                writer.WriteElementString("string", "/Applications/TestApp.app/Contents/MacOS/test_app");
                writer.WriteEndElement();
                writer.WriteElementString("key", "RunAtLoad");
                writer.WriteRaw("<true/>");
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.Close();
                Console.WriteLine("Plist created");
            }
            else
            {
                Console.WriteLine("Plist already exists");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

当我通过控制台运行以下命令时,.plist 文件有效:

launchctl load -w /Users/username/Library/LaunchAgents/teststart.plist

但不是通过代码。我尝试了许多不同的更改,例如将命令和参数设置如下。

var arguments = $"load -w /Users/username/Library/LaunchAgents/teststart.plist";
var command = "launchctl";

任何想法我做错了什么,或者我可以尝试什么?

更新:

我能够通过 Apple Script 使用以下代码将我的程序添加到用户的登录项:

var command = "/bin/bash";
var arguments = " -c \"osascript -e ' tell application \\\"System Events\\\" to make login item at end with properties {{path:\\\"/Applications/Shipmondo.app\\\", hidden:false}}'\"";

【问题讨论】:

    标签: c# .net macos cross-platform


    【解决方案1】:

    我不明白您为什么要尝试从另一个程序启动您的代理。

    当用户登录时,macOS 将为该用户启动一个新的启动进程。这个 launchd 进程将扫描代理目录 /System/Library/LaunchAgents、/Library/LaunchAgents 和用户的 ~/Library/LaunchAgents 以查找属性列表作业文件,并将根据 Disabled 键的值(如果存在)和覆盖数据库的内容。

    加载作业定义不一定会启动作业。作业的启动时间由作业的属性列表文件确定。如果已指定 RunAtLoad 或 KeepAlive 键,则 launchd 将在加载后立即启动作业。

    Apple 关于该主题的文档至少可以说有些过时了,但对于概述,您可以查看存档的 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.htmlhttps://developer.apple.com/library/archive/technotes/tn2083/_index.html,请注意其中一些信息已过时。

    也许现在最好的信息来源是 launchd、launchctl 和 launchctl.plist 的手册页。

    【讨论】:

    • 感谢您的评论,我很可能误解了如何专门使用mac操作和launchctl。我能够使用登录项在启动时启动我的程序。我已经用我的解决方案编辑了问题本身。
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    相关资源
    最近更新 更多