我们有一个我已经编写好的应用程序,现在我已经通过 ClickOnce 向它推送了更新。该应用程序位于我们的主文件服务器上。但每次我推出更新时,我都会被问到我改变了什么!有什么方法可以提供对用户友好的 ClickOnce 更新的个性化描述?例如,当用户启动他们的应用程序时,ClickOnce 会询问“有新版本可用。您要更新吗?”,我可以在下面描述我更新的内容吗?或者这对 ClickOnce 来说是不可能的吗?
4 回答
这是我的做法。我在启动代码中以发布模式调用此方法:
using System.Deployment.Application;
...
private void DisplayChangeLog()
{
if (!ApplicationDeployment.IsNetworkDeployed)
return;
if (!ApplicationDeployment.CurrentDeployment.IsFirstRun)
return;
ThreadPool.QueueUserWorkItem(state =>
Execute.OnUIThread(() => <Pop up window with latest changes> ));
}
我知道这并不完全是您想要的,因为它会在用户第一次运行应用程序但在他们已经安装更新之后显示。在我们的环境中,用户无法选择是否更新,因此没有真正的区别。
不能将 ClickOnce 用作标准。如果您想向用户显示有关更改的消息,那么您需要自己实现它。一种方法是禁用自动更新,然后以编程方式检查更新。然后,您可以使用该版本从 XML 文件或类似文件中获取更改并将其显示给用户。
或者,您可以只提供 HTML 格式的变更日志或其他可能更简单的内容。
例如,请参阅 Stack Overflow 问题寻找在 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();