.net core 使用ClickOnce部署的.net核心控制台应用程序:如何使其作为命令行应用程序使用?

.net core 使用ClickOnce部署的.net核心控制台应用程序:如何使其作为命令行应用程序使用?,.net-core,command-line,console-application,clickonce,.net Core,Command Line,Console Application,Clickonce,我注意到可以使用VisualStudio发布带有ClickOnce的.NETCore5控制台应用程序 TLDR 控制台应用程序的全部要点是能够使用用户输入的命令选项/参数在命令行上调用它。ClickOnce允许我发布一个控制台应用程序这一事实让我相信这是可能的,但是ClickOnce似乎通过模糊exe的实际路径来对抗这种用例。我如何解决这个问题 详细信息 我可以使用ClickOnce部署控制台应用程序,它可以正常工作,但该应用程序只能从Windows的“开始”菜单中找到。无法(轻松地)从命令行

我注意到可以使用VisualStudio发布带有ClickOnce的.NETCore5控制台应用程序

TLDR 控制台应用程序的全部要点是能够使用用户输入的命令选项/参数在命令行上调用它。ClickOnce允许我发布一个控制台应用程序这一事实让我相信这是可能的,但是ClickOnce似乎通过模糊exe的实际路径来对抗这种用例。我如何解决这个问题


详细信息

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

C:\users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\.appref ms

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

这对于wpf应用程序很好,因为它们是从“开始”菜单启动的。但是控制台应用程序呢

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

问题

  • 使用ClickOnce部署控制台应用程序,并在安装期间将其文件路径添加到用户的PATH env变量,并且在不启动新控制台窗口的情况下运行该应用程序,是否有一种低摩擦的方法
  • ClickOnce是命令行应用程序部署的错误工具吗?如果没有,正确的工具是什么
  • 控制台应用程序只能从“开始”菜单启动,不能有参数/选项,这有什么意义

我已经在.Net Framework应用程序上完成了此操作

请注意以下要点:

  • 您需要检测正在运行的应用程序是否已通过网络部署
  • 单击一次应用程序将不使用空格字符作为参数分隔符
  • 在我使用逗号的情况下,需要定义参数分隔字符
  • 在windows命令提示符下,您可以调用应用程序


    myapp.appref-ms argument1、argument2、argument3

    我认为这不是ClickOnce应用程序的使用案例。它适用于控制台应用程序,因为它可能“只是工作”。必须明确允许click once应用程序的参数,并使用查询字符串传递这些参数。您可以分发另一个通用控制台应用程序,作为其他控制台应用程序的前端。通用应用程序只能发布一次(显然不能使用ClickOnce),不需要更新。PS:有些标记为“控制台”的应用程序可以不带参数使用。
    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
    
    }