Application.Restart不传回参数

Jua*_*uan 6 .net c# clickonce command-line

这是一个ClickOnce应用程序.根据文档," 如果您的应用程序最初在首次执行时提供了命令行选项,则Restart将使用相同的选项再次启动应用程序. " 但我不知道这是否应该与ClickOnce应用程序一起工作.如果是这样,我做错了什么?

这是我的代码:

public Form1()
{
    InitializeComponent();         
    textBox1.Text = string.Join(Environment.NewLine, GetCommandLineFile());
}

private static string[] GetCommandLineFile()
{
    if (AppDomain.CurrentDomain != null &&
        AppDomain.CurrentDomain.SetupInformation != null &&
        AppDomain.CurrentDomain.SetupInformation.ActivationArguments != null &&
        AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null &&
        AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Any())
    {
        return AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
    }
    else return new string[] { };
}

private void button1_Click(object sender, EventArgs e)
{
    Application.Restart();
}
Run Code Online (Sandbox Code Playgroud)

我将我的应用程序与.abc扩展名相关联,当我双击我的.abc文件时,应用程序将以文件名作为唯一参数启动,但是当我重新启动时(按下我的button1),GetCommandLineFile()将返回一个空数组.

Iss*_*ram 3

我相信Application.Restart是为标准命令行参数而设计的,而不是 ClickOnce 应用程序如何处理它。

查看 Microsoft 的代码Application.Restart,他们明确检查应用程序是否是 ClickOnce 应用程序,然后在不传递任何参数的情况下重新启动它。任何其他应用程序都会被Environment.GetCommandLineArgs()解析并发送到新进程。

我认为更好的解决方案不是将参数写入文件,而是简单地启动一个新进程,如下所示:

"path\Application Name.appref-ms" arg1,arg2,arg3
Run Code Online (Sandbox Code Playgroud)

这样,当您的应用程序启动时,GetCommandLineFile()应该再次获取参数。