使用ClickOnce部署自动安装更新

11
我想使用ClickOnce部署来发布我的项目。但是当我这样做时,它会在最终用户的计算机上弹出一个对话框询问:

XXXX有一个新版本可用。您现在要下载吗?

但我的最终用户没有鼠标或键盘。所以我的意图是:它必须自动进行更新,但它不能在客户端显示那个对话框。如何通过使用ClickOnce部署来实现这一点?


1
这是与https://dev59.com/13I-5IYBdhLWcg3w3cg8相同的问题。 - jcvegan
请不要在标题中添加标签。相反,请使用更具体的标题。 - SLaks
6
@JoelCoehoorn 不需要挖苦的评论,特别是当从中清楚地看出你不知道技术允许什么时。事实是,ClickOnce确实允许这种配置。 - Andy
我有一个干净的解决方案。请看我的答案这里 - orad
6个回答

13

看起来您可以通过更改构建中的一些属性来实现这一点。

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:显示版本管理重要性的图片:

Minimum Version

同时请注意我已经勾选了“每次发布时自动增加版本修订号”的选项。每次进入项目属性时,版本号都会更新。通常,您只需要在“应用程序更新”窗口中更改版本的“修订号”部分,使其与发布选项卡中的“修订号”匹配即可。


我没有配置MS Build。有没有不用MS Build的方法? - user1054625
1
这对我没有用:1.右键单击您的项目,然后选择属性 2.转到左下角的“发布”选项卡 3.单击“更新...”按钮以打开“应用程序更新”对话框 4.检查“应用程序应该检查更新” 5.选择“应用程序启动之前” 6.检查“为此应用程序指定最低要求版本” 7.将您可以在底层发布窗口中看到的发布版本输入为最小版本。不幸的是,您必须每次发布都更改此设置。不过,可能有一种自动完成此操作的方法。 - user1054625
你设置了最低版本还是把它留空了?就像我说的那样,请确保将其设置为你即将部署的版本。 - Gromer

5
可以的!只要是网络部署的应用程序,您可以使用以下代码轻松检查更新。请参见下面:
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 Forms 应用程序,但仅在网络部署时有效! 在我关于日志记录的所有评论中,原本是使用提示框,但这个版本不需要任何输入!

只有在发布时不指定更新检查位置时,此方法才有效。相反,它会检查安装位置的应用程序文件。不确定是否完全符合您的情况,但希望能有所帮助。 - GeorgeK

3

1
我是一名有用的助手,可以翻译文本。

我知道这是一个老问题,但我仍会回答(希望能帮助到某个人):

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

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

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 并期望应用程序会自动重启到一个更新的版本而无需用户交互

您提供的代码是C#,但问题标记为VB.NET。 - Florian Koch
也就是说,C#标记:/ 检查逻辑,然后转换为VB。 - Ahmed Widatalla

1
任何基于 .exe 文件的 ClickOnce 应用程序都可以通过自定义安装程序进行静默安装和更新。自定义安装程序可以在安装过程中实现自定义用户体验,包括用于安全和维护操作的自定义对话框。为执行安装操作,自定义安装程序使用 InPlaceHostingManager 类。
要实现此解决方案,请参阅此 链接

0
在Ahmed的回答后面,以下是VB.NET代码,其中包含一些小的改进。它可能不符合最佳实践,但易读且描述清晰。
''' <summary>
''' Checks if the update is available for network based deployment and download it.
''' </summary>
''' <param name="autoDownloadUpdate">If the update is available, should it be downloaded automatically.<para>Default value is <code>True</code></para></param>
''' <returns>It will return <code>True</code> only if the latest version is already installed.
''' <para>If autoDownloadUpdate is set to <code>True</code>, the update is auto downloaded (and app restarts and nothing is returned) else it returns <code>False</code>.</para>
''' </returns>
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()

有任何反馈可以进一步完善答案...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接