2012-01-07 3 views
6

ClickOnce 응용 프로그램입니다. documentation에 따르면 "응용 프로그램이 처음 실행될 때 명령 줄 옵션을 처음 제공 한 경우 다시 시작하면 다시 같은 옵션을 사용하여 응용 프로그램이 시작됩니다". 그러나 이것이 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(); 
} 
나는 .abc 확장자 내 응용 프로그램을 연결

내가 내 .abc 파일을 더블 클릭하면, 응용 프로그램이 유일한 인수로 파일 이름으로 시작됩니다,하지만 때 내가 : 여기

내 코드입니다 (키를 눌러) 다시 시작하면 GetCommandLineFile()은 빈 배열을 반환합니다.

+0

동일한 문제가 있습니다. 내 응용 프로그램이 동일한 인수를 사용하여 다시 시작해야합니다. Application.Restart()를 호출하면 동일한 인수를 (적어도 ClickOnce를 사용하지 않을 때는) 확실히 전달하지 않습니다. 나는 이것을 할 다른 방법을 찾을 수 없다. Restart() 메서드를 사용하면 새 인수를 전달할 수 없으며 Process.Start를 호출하는 것은 좋지 않습니다. 왜냐하면 업데이트로 인해 다시 시작되면 실행 파일 경로가 변경 될 것이고 어쨌든 .xml 파일의 경로를 찾을 수 없기 때문입니다. appref-ms – Nick

+0

제 해결 방법은 업데이트/재시작 전에 명령 줄 인수를 데이터 디렉토리의 파일에 작성하고 다시 시작한 후에 명령 줄 인수가없는 경우 인수 파일이 있는지 확인하는 것입니다. 이 경우 파일에서 인수를로드하고 파일을 삭제합니다. – Nick

+0

그래, 나는 이런 식으로 일을 끝냈다. – Juan

답변

3

Application.Restart은 ClickOnce 응용 프로그램에서 처리하는 대신 표준 명령 줄 인수로 사용됩니다.

Application.Restart에 대한 Microsoft의 코드를 보면 응용 프로그램이 ClickOnce 응용 프로그램인지 여부를 명시 적으로 확인한 다음 을 다시 시작하고 어떤 인수도 전달하지 않습니다. 다른 응용 프로그램은 Environment.GetCommandLineArgs()을 파싱하여 새 프로세스로 보냅니다.

내가 대신 파일에 쓰기 인수의, 더 나은 솔루션을 생각 단순히 같은 새로운 프로세스를 시작하는 것입니다 : 응용 프로그램이 시작될 때

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

그런 식으로, GetCommandLineFile() 다시 인수를 잡아해야 .

관련 문제