使用ClickOnce在更新后获取程序的两个实例

时间:2012-10-27 06:22:33

标签: c# winforms .net-4.0 clickonce

我已经开始设置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

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

我已将它放在我的MainForm.csProgram.cs中,两者的结果相同。我包括我的Main()以防万一它是相关的。

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

1 个答案:

答案 0 :(得分:0)

好的,想通了。 Jeremy Thompson提供的链接给了我一些想法......主要是延迟,但没有实现一个睡眠线程(因为在该代码的实例中只是延迟了应用程序的启动)。

我最终做的是在我的默认构造函数中实现一个可选参数,它启动了一个计时器(设置为1.5秒,但如果应用程序需要更多的启动时间,可以根据需要进行修改)。当我调用Tick时,Timer的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构造函数而不是{{1}中的类级别标志}}