10

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

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

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

4

6 回答 6

12

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

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:显示版本控制很重要的图像:

最低版本

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

于 2012-10-11T15:43:58.813 回答
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 窗体应用程序,但前提是您是网络部署的!你看到我所有关于日志记录的评论是我最初使用带有提示的消息框的地方,但这是不需要任何输入的版本!

于 2012-10-11T16:39:44.127 回答
3

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

于 2016-12-18T23:32:24.273 回答
1

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

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

于 2016-08-12T13:19:47.857 回答
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并期望应用程序将自动重新启动到较新版本而无需用户交互

于 2017-10-26T11:13:46.093 回答
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()

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

于 2018-02-07T14:54:43.380 回答