ClickOnce应用程序不接受命令行参数

时间:2011-09-28 19:35:49

标签: vb.net clickonce

我有一个VB.NET应用程序,它接受命令行参数。

在调试时它工作正常我提供了关闭Visual Studio的ClickOnce安全设置。

当我尝试通过ClickOnce在计算机上安装应用程序并尝试使用参数运行它时,会出现问题。当发生这种情况时我会崩溃(哦,不!)。

此问题有一种解决方法:将文件从最新版本的发布文件夹移动到计算机的C:驱动器,然后从.exe中删除“.deploy”。从C:驱动器运行应用程序,它将正好处理参数。

有没有比我上面的解决方法更好的方法来实现这个?

谢谢!

1 个答案:

答案 0 :(得分:4)

“命令行参数”仅适用于从URL运行的ClickOnce应用程序。

例如,这是您应该如何启动应用程序以附加一些运行时参数:

  

http://myserver/install/MyApplication.application?argument1=value1&argument2=value2

我有以下用于解析ClickOnce激活URL和命令行参数的C#代码:

public static string[] GetArguments()
{
    var commandLineArgs = new List<string>();
    string startupUrl = String.Empty;

    if (ApplicationDeployment.IsNetworkDeployed &&
        ApplicationDeployment.CurrentDeployment.ActivationUri != null)
    {
        // Add the EXE name at the front
        commandLineArgs.Add(Environment.GetCommandLineArgs()[0]);

        // Get the query portion of the URI, also decode out any escaped sequences
        startupUrl = ApplicationDeployment.CurrentDeployment.ActivationUri.ToString();
        var query = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
        if (!string.IsNullOrEmpty(query) && query.StartsWith("?"))
        {
            // Split by the ampersands, a append a "-" for use with splitting functions
            string[] arguments = query.Substring(1).Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries).Select(a => String.Format("-{0}", HttpUtility.UrlDecode(a))).ToArray();

            // Now add the parsed argument components
            commandLineArgs.AddRange(arguments);
        }
    }
    else
    {
        commandLineArgs = Environment.GetCommandLineArgs().ToList();
    }

    // Also tack on any activation args at the back
    var activationArgs = AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
    if (activationArgs != null && activationArgs.ActivationData.EmptyIfNull().Any())
    {
        commandLineArgs.AddRange(activationArgs.ActivationData.Where(d => d != startupUrl).Select((s, i) => String.Format("-in{1}:\"{0}\"", s, i == 0 ? String.Empty : i.ToString())));
    }

    return commandLineArgs.ToArray();
}

这样我的主要功能如下:

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        var commandLine = GetArguments();
        var args = commandLine.ParseArgs();

        // Run app
    }