我已经开始设置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.cs
和Program.cs
中,两者的结果相同。我包括我的Main()
以防万一它是相关的。
[STAThread]
static void Main() {
CheckForUpdate();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new MainForm() );
}
答案 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}中的类级别标志}}