0

呼び出した後、セットアップを開始ClickOnceし、以下のコードを使用するApplication.Restart();と、アプリケーションの 2 つのインスタンス (新しく更新されたものと以前のバージョン) が作成されます。

    private static void CheckForUpdate() {
            ApplicationDeployment updateCheck = ApplicationDeployment.CurrentDeployment;
            UpdateCheckInfo info = updateCheck.CheckForDetailedUpdate();
            if(info.UpdateAvailable) {
                updateCheck.Update();
                MessageBox.Show( "The application has been upgraded, and will now restart." );
                Application.Restart();
            }
    }//this has try/catch but didn't think it would be relevant 
     //since no exception is being thrown

クリック ワンスを使用するのはこれが初めてで、その単純さに驚いていますが、手動チェックをどこに置くべきかよくわかりませんでした (ユーザーに選択肢を与えたり、醜い更新ウィンドウを表示したりしたくありません)。 .

私はそれを myMainForm.csと my の両方に配置しましたが、両方でProgram.cs同じ結果が得られました。Main()関連する場合に備えて、私のものを含めています。

[STAThread]
static void Main() {
    CheckForUpdate();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault( false );
    Application.Run( new MainForm() );
}
4

1 に答える 1

0

わかりました、それを理解しました。Jeremy Thompsonによって提供されたリンクは、私にいくつかのアイデアを与えました...主に遅延ですが、スリープスレッドを実装していません(そのコードのインスタンスでは単にアプリの起動を遅らせたため)。

私がやったことは、タイマーを開始するデフォルトのコンストラクターにオプションのパラメーターを実装することでした(1.5秒に設定されていますが、アプリがより多くの起動時間を必要とする場合は必要に応じて変更できます)。タイマーのTickイベントが発生したときそれは私が電話したときですApplication.Restart()。私のアプリには、本来のようにセットアップするためのActive Directory呼び出しとデータベース呼び出しがいくつかあります。これが予期しない結果の原因であると推測していますが、よくわかりません。

新しいコンストラクター...

public MainForm(bool WasUpdated = false) {
    InitializeComponent();
    if(!WasUpdated) {
        instance = this;
        Icon = DesktopInterface.MainForm.Properties.Resources.favicon;
        tabPages = DesktopInterface.MainForm.Setup.TabSetup.GetTabs();
        foreach(var page in tabPages) {
            tabControl1.TabPages.Add( page );
        }
    } else {
        restartTimer.Start();
    }
}

と私の変更Program.cs

[STAThread]
static void Main() {
    CheckForUpdate();
    SetAddRemoveProgramsIcon();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault( false );
    Application.Run( new MainForm(WasUpdated) );
}
//WasUpdated is a class level variable that gets set inside of the CheckForUpdate method

完全なCheckForUpdate()方法...

private static void CheckForUpdate() {
            try {
                ApplicationDeployment updateCheck = ApplicationDeployment.CurrentDeployment;
                UpdateCheckInfo info = updateCheck.CheckForDetailedUpdate();
                if(info.UpdateAvailable) {
                    updateCheck.Update();
                    WasUpdated = true;
                    MessageBox.Show( "The application has been upgraded, and will now restart." );
                }
            } catch(DeploymentDownloadException ex) {
                MessageBox.Show( "Automatic Update Failed.  Error: " + ex );
            } catch(InvalidDeploymentException ex) {
                MessageBox.Show( "Automatic Update Failed.  Error: " + ex );
            } catch(DeploymentException ex) {
                MessageBox.Show( "Automatic Update Failed.  Error: " + ex );
            } catch(Exception ex) {
                MessageBox.Show( "Automatic Update Failed.  Error: " + ex );
            }
        }

これを投稿した後に私がやることになるのCheckForUpdate()は、戻り値を持つように切り替えてMainForm、クラスレベルのフラグを持たずにコンストラクターに渡すことです。Program.cs

于 2012-10-27T07:23:45.507 に答える