2012-01-07 12 views
6

Esta es una aplicación ClickOnce. De acuerdo con documentation, "Si su aplicación se suministró originalmente opciones de línea de comandos cuando se ejecutó por primera vez, el reinicio abrirá la aplicación nuevamente con las mismas opciones.". Pero no sé si se supone que esto funciona o no con las aplicaciones ClickOnce. Si es así, ¿qué estoy haciendo mal?Application.Restart no pasa argumentos atrás

Aquí está mi código:

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(); 
} 

asocié mi aplicación con la extensión .abc y cuando hago doble clic mi archivo .abc, la aplicación se iniciará con el nombre de archivo que el único argumento, pero luego, cuando me reinicie (al presionar my button1), GetCommandLineFile() devolverá una matriz vacía.

+0

Estoy teniendo el mismo problema. Necesito que mi aplicación se reinicie usando los mismos argumentos. Simplemente llamando a Application.Restart() definitivamente * no * pasa los mismos argumentos (al menos no cuando se usa ClickOnce). No puedo encontrar ninguna otra forma de hacer esto tampoco. El método Restart() no le permite pasar nuevos argumentos y llamar a Process.Start no sirve porque si se reinicia debido a una actualización, la ruta del ejecutable cambiará, y no puedo encontrar de todos modos para obtener la ruta del. appref-ms – Nick

+0

Mi solución consiste en escribir los argumentos de la línea de comando en un archivo el directorio de datos antes de actualizar/reiniciar y si no aparece ningún argumento de línea de comando después del reinicio, comprueba si el archivo de argumentos existe. si lo hace, carga los argumentos del archivo y elimina el archivo. – Nick

+0

Sí, terminé haciendo algo como esto. – Juan

Respuesta

3

Creo que Application.Restart fue diseñado para argumentos de líneas de comando estándar en lugar de cómo lo manejan las aplicaciones ClickOnce.

Al mirar el código de Microsoft Application.Restart, se comprueba explícitamente si la aplicación es ClickOnce y luego la reinicia sin se pasan los argumentos. Cualquier otra aplicación, obtiene Environment.GetCommandLineArgs() analizado y enviado a un nuevo proceso.

creo que una mejor solución, en lugar de escribir argumentos a un archivo, es simplemente iniciar un nuevo proceso como tal:

"path\Application Name.appref-ms" arg1,arg2,arg3 

esta manera, cuando se inicia la aplicación, GetCommandLineFile() debe agarrar los argumentos de nuevo .

Cuestiones relacionadas