使用ClickOnce部署的.NET Core控制台应用程序:如何使其可用作命令行应用程序?

6

我注意到使用Visual Studio可以使用ClickOnce发布一个 .net core 5控制台应用程序。

TLDR; 控制台应用程序的整个目的是让用户能够在命令行上调用它并输入命令选项/参数。ClickOnce允许我发布控制台应用程序,这说明这是可能的,但是ClickOnce似乎与这种用例相冲突,因为它会隐藏实际的exe路径。我该如何解决这个问题?


详细信息

我可以使用ClickOnce来部署控制台应用程序,并且它也能正常工作,但是应用程序只能从Windows“开始”菜单中找到。该应用程序无法(轻松地?)从命令行调用,因为其位置不在用户的环境变量路径中。正如您所知,clickonce会在“开始”菜单中放置可执行文件的快捷方式…

C:\users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<ConsoleApp>.appref-ms

其中 <ConsoleApp>.appref-ms 是指向安装程序的UNC文件路径的应用程序引用。如果我理解正确,clickonce确实将应用程序安装到用户的计算机上,但是隐藏了实际可执行文件的位置/路径。您基本上只能使用应用程序引用来启动ClickOnce应用程序。

对于wpf应用程序来说,这样做很好,因为这些应用程序是从“开始”菜单中启动的。但是控制台应用程序怎么办?

我正在编写的控制台应用程序需要用户提供选项/参数。如果它只在“开始”菜单中,它将被启动并运行,而没有任何选项/参数。此外,它会在一个新的控制台窗口中启动。这使得控制台应用程序(以这种方式部署时)成为仅仅作为用户在powershell中执行其他操作时可用的另一个命令。

问题

  • 是否有一种低摩擦力的方法使用ClickOnce部署控制台应用程序,并在安装期间将其文件路径添加到用户的PATH环境变量中,并且不启动新的控制台窗口运行?
  • ClickOnce是否是错误的工具用于命令行应用程序部署?如果不是,正确的工具是什么?
  • 只能从“开始”菜单启动且不能带有arg/options的控制台应用程序的意义是什么?

2
我不认为ClickOnce应用程序适用于这种情况。它对于控制台应用程序有效,因为它可能“只需运行”。必须明确允许并使用查询字符串传递ClickOnce应用程序的参数。您可以分发另一个通用控制台应用程序,该应用程序将用作其他控制台应用程序的前端。通用应用程序只能分发一次(显然不能使用ClickOnce),不需要更新。PS:有些标记为“控制台”的应用程序可以在不带参数的情况下使用。 - Simon Mourier
1个回答

1

我已经在 .Net Framework 应用程序上完成了这个任务

请注意以下重要事项:

  1. 您需要检测正在运行的应用程序是否是网络部署的
  2. ClickOnce 应用程序不会将空格字符作为参数分隔符
  3. 您需要定义参数分隔符,在我的情况下我使用逗号
static void
 Main(string[] args)
{
    if (ApplicationDeployment.IsNetworkDeployed)
    {
        var inputArgs = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
        if (inputArgs != null && inputArgs.Length > 0)
        {
            args = inputArgs[0].Split(new char[] { ',' });
        }
    }
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm(args)); // Here you pass the argument to the application

}

在Windows命令提示符中,您可以调用应用程序:
myapp.appref-ms 参数1,参数2,参数3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接