如何使用ClickOnce提供更新说明?

我们有一个应用程序,我编写了很多年,现在我通过ClickOnce推送更新。 该应用程序位于我们的主文件服务器上。 但每当我推出更新时,我都会被问到我改变了什么! 有没有办法用ClickOnce提供个性化的更新说明,这将是用户友好的? 例如,当用户启动他们的应用程序时,ClickOnce会询问“新版本是否可用。您要更新吗?”,在下面我可以描述我已更新的内容? 或者ClickOnce是不可能的?

我就是这样做的。 我在我的启动代码中以Release模式调用此方法:

using System.Deployment.Application; ... private void DisplayChangeLog() { if (!ApplicationDeployment.IsNetworkDeployed) return; if (!ApplicationDeployment.CurrentDeployment.IsFirstRun) return; ThreadPool.QueueUserWorkItem(state => Execute.OnUIThread(() =>  )); } 

我知道这不是你想要的,因为它显示用户第一次运行应用程序但是他们已经安装了更新之后。 在我们的环境中,用户无论是否更新都无法选择,因此没有什么区别。

ClickOnce不可能作为标准。 如果要向用户显示有关更改的消息,则需要自己实现。 一种方法是禁用自动更新,然后以编程方式检查更新 。 然后,您可以使用该版本从XML文件或类似文件中获取更改并将其显示给用户。

或者,您可以提供HTML格式的更改日志或可能更简单的更新日志 。

例如,请参阅Stack Overflow问题寻找recomendation以在ClickOnce应用程序中显示发行说明

无论哪种方式,一般来说如果有更新,为什么用户不想要它?

我最近花了相当多的时间研究并以编程方式操作在ClickOnce应用程序发布期间生成的清单文件,我没有看到添加自由表单描述的方法,如你想要的那样,以及当然没有办法通过Visual Studio提供的向导或UI来实现它。

(警告:我明天会在工作中仔细检查这一点,以确保完全没有办法 – 但你应该假设没有。)

只要您让ClickOnce自动检查更新,就无法更改ClickOnce的更新对话框。

要实现此目的,您必须使用ApplicationDeployment.CurrentDeployment提供的方法在应用程序中以编程方式处理更新。 这允许您定义自己的更新对话框。 在这里查看官方的HowTo。 核心原则如下:

 ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; info = ad.CheckForDetailedUpdate(); if (info.UpdateAvailable) { // insert your update dialog here ad.Update(); } 

但是,在调用ad.Update()时,在那里描述的方法中存在一个错误,并且您在ClickOnce部署中有文件关联。 有关详细信息,请参阅论坛和错误报告 。 (我不知道这个bug是否已修复。)

作为解决方法,您可以通过以下行替换ad.Update()

 var application = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName.Split('#')[0] + "?"; proc = new Process { StartInfo = { FileName = "iexplore.exe", Arguments = application, UseShellExecute = true } }; proc.Start(); Application.Current.Shutdown();