2012-01-07 9 views
6

これはClickOnceアプリケーションです。 documentationによると、 "アプリケーションが最初に実行されたときに最初にコマンドラインオプションが提供された場合、Restartは同じオプションでアプリケーションを再び起動します。"しかし、これが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を呼び出すのは良いことではありません。なぜなら、更新のために再起動した場合、実行可能なパスが変更されてしまうからです。 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()が再び引数をつかむ必要があります。

関連する問題