2017-01-23 116 views
7

我们有一个.Net应用程序,它使用ClickOnce来自动更新。但Click Once的问题在于,无论项目中是否发生任何变化,所有程序集都会得到更新。我在想手动更新只有更改dll到以前的ClickOnce发布文件夹和更新清单使用MageUI.exe。我也想到增量更改组件版本,以便我们可以通过查看安装ClickOnce应用程序的用户的缓存文件夹来跟踪哪些程序集已更改。我想知道这是一个可接受的的方法吗?谢谢。在ClickOnce中维护程序集版本?

+0

听起来像是等待发生的问题,如果你问我。如果一位客户错过了特定的“中间”更新,该怎么办?他会得到一个新版本,但是可能不包含前一版本中引入的一些他没有得到的更改。 – user1429080

+0

所以,点击一次安装后,我们将检查验证所有dll的版本号。因此,如果更新1有一个版本为#1.1.1.1的dll,并且更新2有另一个版本为1.1.1.2的dll,则更新3单击一次安装应该具有版本1.1.1.1的dll 1和版本1.1.1.2的dll 2与更新3中引入的更改。实际上,最新的点击一次发布将被更新以使用mage ui添加增量dll,并且所有客户端将获得相同的发布,因此,如果客户端在较旧版本中,他也会得到更新到最新。 –

+0

但这并不意味着每个版本都必须包含所有以前的版本+当前版本的更改?意思是,每个发行版都会变得更加“胖”,直到下一个发行版需要包含所有内容为止。无论如何,据我所知,支持从任何旧版本升级到当前版本的唯一方法是在每个版本中包含所有内容。如果你有一组用户,并且能够控制它们定期更新,那么也许这可以起作用... – user1429080

回答

4

我认为这不是必需的。同时通过的ClickOnce提供的更新对话框不会这么告诉你,当满足以下条件的ClickOnce将无法下载文件:

  • 该文件的哈希值是相同的
  • 该文件的时间戳是相同的。
  • 对于组件,它可能需要强命名他们

相反,它会在文件从先前版本复制。

因此,如果您使用强名称并且在没有更改时不重建程序集,则ClickOnce应该按照您希望的方式执行。

参见herehere以供参考。

Here是官方消息说

当更新应用程序,除非该文件已更改的ClickOnce不下载的所有文件,为应用程序的新版本。相反,它会将当前应用程序的应用程序清单中指定的文件的哈希签名与新版本的清单中的签名进行比较。如果文件签名不同,ClickOnce会下载新版本。如果签名匹配,则文件从一个版本到下一个版本没有更改。在这种情况下,ClickOnce将复制现有文件并在新版本的应用程序中使用它。这种方法可以防止ClickOnce再次下载整个应用程序,即使只有一个或两个文件发生了变化。

+0

是的,这是真的,但是当解决方案被构建时,所有程序集的清单更改无论有没有代码更改或没有。 –

+0

是的,你是对的。您必须将项目放入不同的解决方案中,并手动更新“主”项目中的引用程序集。我同意这比把它们都放在一个解决方案中要方便得多。但是仍然是IMO,它比尝试强制ClickOnce在哈希签名更改时执行部分更新要好得多。 – wkl

+0

对于我们的应用程序,我们必须在部分dll更新的项目设置中设置标志完全信任的应用程序,而不仅仅是强烈命名 – VMAtm