#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
}