重新启动并更新生产中的ClickOnce应用程序

时间:2014-07-17 03:04:12

标签: clickonce

短版

有没有办法在ClickOnce应用程序运行时自动更新它?

长版......

设置

我有一个API和一个控制台代理,用于我正在开发的应用程序。我需要卸载一些工作,这是处理它的最简单,最快捷的方法。我是ClickOnce的新手(这是我实际使用它的唯一时间),但它对我来说似乎很完美。我已对其进行设置,以便应用程序在线运行"无需安装"选项集。

在高规模时,代理会调用API来询问它应该做什么,并且API会返回任务以及所需的任何参数。

问题

由于"安静'我的控制台运行的本质,我试图让它尽可能少的用户交互。但是,我现在面临需要更新它的问题。理想情况下,它会在我的衣柜中的服务器上运行,所以我真的不需要连接显示器以及每次我需要重新启动应用程序时的所有内容。

在ClickOnce应用程序运行时是否有更好的方法来更新?

可能的解决方案

我在搜索中找不到与此相关的任何。我发现有几个地方在谈论更新,但他们都提供了如何在应用程序启动时检查更新的示例。这对我来说甚至都不相关,因为我没有在客户机上安装它。

正如我所说,服务器正在将命令推送到应用程序,因此对我来说实现一个说“执行更新”的问题并不成问题。"我最初的想法就是这样做,然后做一个Process.Start(string)从我的网络服务器上取出.application文件,当然这个文件会有最新版本。我可以这样做,然后停止正在运行的实例,理论上这将起作用。

但这会引发签署问题。我不愿意处理签名,虽然我从来没有做过任何事情,所以也许它并不像听起来那么糟糕。但是现在,当我从我的网站启动跑步者时,它需要我点击Windows对话框以确保我认识到风险。我不在乎是否必须在第一次运行时这样做,但显然否定了能够像这样进行生产中更新的好处。

也许签名比我想象的容易?有没有一种好的方法可以免费签署应用程序并让它值得信赖,以至于我可以避免这种对话,至少在我接受过它之后呢?

我喜欢标准的方法来做到这一点,但由于它不是一个特别标准的问题,我也对不太标准的方式持开放态度。例如,如果我可以启动另一个控制台应用程序,停止主应用程序,交换一些应用程序文件,然后启动它,这可能会起作用。但这听起来很容易失败,而且通常比我想要的更复杂。

它不一定是100%的解决方案。显然这会很好,但只是那些大多数时间的东西就足够了,因为这实际上是我个人的项目,而不是客户计算机上的任何东西。

1 个答案:

答案 0 :(得分:2)

您需要ApplicationDeployment

有方法CheckForUpdate()CheckForUpdateAsync()

如果有可用更新,请使用Update()UpdateAsync()

这是重启ClickOnce应用程序的一种方法。

using System.Diagnostics;
using System.Windows;

public class Foo
{
    public void Restart()
    {
        Process.Start(Application.ResourceAssembly.Location);
        Application.Current.Shutdown();
    }
}