Приложение ClickOnce не принимает аргументы командной строки

#vb.net #clickonce

#vb.net #clickonce

Вопрос:

У меня есть VB.NET приложение, принимающее аргументы командной строки.

Он отлично работает при отладке при условии, что я отключил параметр безопасности ClickOnce в Visual Studio.

Проблема возникает, когда я пытаюсь установить приложение на компьютер через ClickOnce и пытаюсь запустить его с аргументами. Я получаю сбой, когда это происходит (о нет!).

Существует обходной путь для решения этой проблемы: переместите файлы из папки публикации последней версии на диск C: компьютера и удалите «.deploy» из .exe. Запустите приложение с диска C:, и оно отлично обработает аргументы.

Есть ли лучший способ заставить это работать, чем обходной путь, который я описал выше?

Спасибо!

Комментарии:

1. Помогает ли эта статья ?

Ответ №1:

«Аргументы командной строки» работают только с приложением ClickOnce, когда оно запускается с URL.

Например, вот как вы должны запускать свое приложение, чтобы присоединить некоторые аргументы во время выполнения:

http://myserver/install/MyApplication.application?argument1=value1amp;argument2=value2

У меня есть следующий код на C #, который я использую для анализа URL-адресов активации ClickOnce и аргументов командной строки:

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

    if (ApplicationDeployment.IsNetworkDeployed amp;amp;
        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) amp;amp; query.StartsWith("?"))
        {
            // Split by the ampersands, a append a "-" for use with splitting functions
            string[] arguments = query.Substring(1).Split(new[] { 'amp;' }, 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 amp;amp; 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
    }