我想使用ClickOnce部署来发布我的项目。但是当我这样做时,它会在最终用户的计算机上弹出一个对话框询问:
XXXX有一个新版本可用。您现在要下载吗?
但我的最终用户没有鼠标或键盘。所以我的意图是:它必须自动进行更新,但它不能在客户端显示那个对话框。如何通过使用ClickOnce部署来实现这一点?
XXXX有一个新版本可用。您现在要下载吗?
但我的最终用户没有鼠标或键盘。所以我的意图是:它必须自动进行更新,但它不能在客户端显示那个对话框。如何通过使用ClickOnce部署来实现这一点?
看起来您可以通过更改构建中的一些属性来实现这一点。
http://blog.jnericks.com/configuring-msbuild-to-auto-update-clickonce
- MinimumRequiredVersion - 告诉ClickOnce更新应用程序时应更新到此版本(但这并不强制ClickOnce执行更新)。正如您所看到的,我们将其设置为与ApplicationVersion设置相同的版本号,以便MinimumRequiredVersion始终是最新版本。
- UpdateMode=Foreground - 告诉ClickOnce在打开应用程序之前更新应用程序。
- UpdateRequired=True - 告诉ClickOnce自动执行更新。
没有MSBuild场景:
然后发布应用程序并对其进行测试。这对我在本地测试应用程序很有效。
编辑:看起来有些人已经成功更新了最低所需版本,可能要研究一下他们的解决方案。
编辑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
除了Gromer的回答之外,只需在您的项目中安装AutoUpdateProjectsMinimumRequiredClickOnceVersion NuGet包。一旦您的项目设置为检查更新并使用最低要求版本,它将确保最低要求版本始终与当前版本匹配(即用户将始终被强制升级到最新版本)。
我知道这是一个老问题,但我仍会回答(希望能帮助到某个人):
首先,你需要检查:选择应用程序何时检查更新 >> 在应用程序启动后。
其次,将此方法添加到您的代码中:
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;
}
}
''' <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()
有任何反馈可以进一步完善答案...