使用ClickOnce部署自动安装更新

我想用ClickOnce部署部署我的项目。 但当我这样做时,它是在最终用户机器的对话框中询问:

可以使用新版本的XXXX。 你想现在下载吗?

但我的最终用户没有鼠标或键盘。 所以我的意图是:它必须自动获取更新,但它不能在客户端询问该对话框。 如何使用ClickOnce部署实现此目的?

看起来你可以通过改变构建中的一些属性来做到这一点。

http://blog.jnericks.com/configuring-msbuild-to-auto-update-clickonce

  1. MinimumRequiredVersion – 告诉ClickOnce,当它更新此应用程序时,它应该更新到此版本(但是这不会强制ClickOnce执行更新)。 如您所见,我们将其设置为ApplicationVersion设置的相同版本号,以便MinimumRequiredVersion始终是最新版本。
  2. UpdateMode = Foreground – 告诉ClickOnce在打开之前更新应用程序。
  3. UpdateRequired = True – 告诉ClickOnce自动执行更新。

没有MSBuild场景:

  1. 右键单击您的项目,然后选择属性
  2. 转到左下角的“发布”标签
  3. 单击“更新…”按钮以打开“应用程序更新”对话框
  4. 选中“应用程序应检查更新”
  5. 选择“在应用程序启动之前”
  6. 选中“为此应用程序指定所需的最低版本”
  7. 输入您可以在基础“发布”窗口中看到的发布版本作为最低版本。 不幸的是,您必须在每次发布时更改此内容。 不过,可能有一种方法可以实现自动化。

然后发布应用程序并测试它。 在本地测试应用程序中,这对我来说很好。

编辑:看起来有些人已经获得了更新所需的最低版本,可能想要查看他们的解决方案 。

编辑2:显示版本控制重要性的图像:

最低版本

另外,请注意我已选中“每次发布时自动增加修订”。 每次进入项目的属性时,该版本都是最新的。 您通常只需在“应用程序更新”窗口中更改版本的“修订版”部分,以匹配“发布”选项卡中的“修订版”。

当然可以! 只要它是网络部署的应用程序,您就可以使用此代码轻松检查更新。 见下文:

Private Sub InstallUpdates() Dim info As UpdateCheckInfo = Nothing If (ApplicationDeployment.IsNetworkDeployed) Then Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment Try info = AD.CheckForDetailedUpdate() Catch dde As DeploymentDownloadException (You may want to log here) Return Catch ioe As InvalidOperationException (You may want to log here) Return End Try If (info.UpdateAvailable) Then Try AD.Update() Application.Restart() Catch dde As DeploymentDownloadException (You may want to log here) Return End Try End If End If End Sub 

您可以输入此代码段并在启动时调用它。 它适用于控制台应用程序, Windows窗体应用程序,但仅限于您部署网络! 你在哪里看到我关于日志记录的所有评论是我最初使用带提示的消息框的地方,但这是不需要任何输入的版本!

除了Gromer的答案 ,只需在项目中安装AutoUpdateProjectsMinimumRequiredClickOnceVersion nuget包 。 一旦您的项目设置为检查更新并使用最低要求版本,这将处理确保所需的最低版本始终与您当前的版本匹配(即用户将始终被迫更新到最新版本)。

基于.exe文件的任何ClickOnce应用程序都可以由自定义安装程序以静默方式安装和更新。 自定义安装程序可以在安装期间实现自定义用户体验,包括用于安全和维护操作的自定义对话框 要执行安装操作,自定义安装程序使用InPlaceHostingManager类。

要实现此解决方案,请参阅此链接

我知道这是一个古老的Q.但是,无论如何我会回答。 (希望它会帮助某人):

首先 ,您需要检查: 选择何时应用程序应检查更新 >> 应用程序启动后

其次 ,将此方法添加到您的代码中:

 private Boolean isVersionOK() { UpdateCheckInfo info = null; if (ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; try { info = ad.CheckForDetailedUpdate(); } catch (DeploymentDownloadException) { // No network connection return false; } catch (InvalidDeploymentException) { return false; } catch (InvalidOperationException) { return false; } if (info.UpdateAvailable) { try { ad.Update(); Application.Restart(); Environment.Exit(0); } catch (DeploymentDownloadException) { // No network connection } return false; } return true; } else { return false; } } 

最后 ,您只需在应用程序的开头调用isVersionOK() ,并根据需要在每个循环中调用以检查更新。 如果您使用的是最新版本,它将返回TRUE ,否则它将返回FALSE并期望应用程序将在没有用户交互的情况下自动重新启动到更新的版本。

在Ahmed的回答的后续内容中,下面是VB.NET中的代码,略有增强。 它可能不是最佳实践,但它具有可读性和描述性。

 '''  ''' Checks if the update is available for network based deployment and download it. '''  ''' If the update is available, should it be downloaded automatically.Default value is True ''' It will return True only if the latest version is already installed. ''' If autoDownloadUpdate is set to True, the update is auto downloaded (and app restarts and nothing is returned) else it returns False. '''  Shared Private Function CheckAndDownloadUpdate(ByVal Optional autoDownloadUpdate As Boolean = True) As Boolean If ApplicationDeployment.IsNetworkDeployed = False Then Return False Dim appDeployment As ApplicationDeployment = ApplicationDeployment.CurrentDeployment Dim info As UpdateCheckInfo = Nothing Try info = appDeployment.CheckForDetailedUpdate Catch ex As Exception ' Exceptions if you want to handle individually 'DeploymentDownloadException ' No network connection 'InvalidDeploymentException 'InvalidOperationException Return False End Try ' If no update is available, it means latest version is installated If info.UpdateAvailable = False Then Return True ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' If we are here, it means an update is available on the network ' if autoDownload is False, simply return False If autoDownloadUpdate = False Then Return False Try appDeployment.Update() Application.Restart() Environment.Exit(0) Catch ex As DeploymentDownloadException ' No network connection Return False End Try End Function 

然后在您的启动代码中,您可以这样调用

 CheckAndDownloadUpdate() 

任何反馈,以进一步提高答案…