0

我已经开始ClickOnce设置并在调用后使用下面的代码Application.Restart();我最终得到了两个应用程序实例(新更新的一个和以前的版本)。

    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

这是我第一次使用单击一次,虽然我对它的简单性感到惊讶,但我不太确定在哪里进行手动检查(我不希望用户有选择或看到丑陋的更新窗口) .

我已经把它放在我的MainForm.cs和我的两者中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 秒,但如果应用程序需要更多启动时间,可以根据需要进行修改)。当 Timer 的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 回答