【问题标题】:Maintaining assembly version in ClickOnce?在 ClickOnce 中维护程序集版本?
【发布时间】:2017-01-23 07:14:15
【问题描述】:

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

【问题讨论】:

  • 如果你问我,这听起来像是一个等待发生的问题。如果一个客户错过了特定的“中间”更新怎么办。他将获得一个新版本,但其中可能不包含之前版本中引入的一些他没有获得的更改。
  • 所以,点击安装后,我们将检查所有 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,并且所有客户端都将获得相同的版本,因此,如果客户端使用旧版本,他也会获得更新到最新。
  • 但这是否意味着每个版本都必须包含所有先前版本中的所有内容以及当前版本的更改?意思是,每个版本都会变得“更胖”,直到某个时候下一个版本需要包含所有内容?无论如何,据我所知,支持从 any 旧版本升级到当前版本的唯一方法是在每个版本中包含所有内容。如果您的用户数量有限,并且能够控制他们定期更新,那么也许这可以发挥作用......

标签: .net clickonce mageui


【解决方案1】:

我认为这没有必要。虽然 ClickOnce 提供的更新对话框没有告诉您,但当满足以下条件时,ClickOnce 将不会下载文件:

  • 文件的哈希值相同
  • 文件的时间戳相同。
  • 对于程序集,可能需要对其进行强命名

它会从以前的版本中复制文件。

因此,如果您使用强名称并且在程序集未更改时不重新构建它们,ClickOnce 应该完全按照您的意愿执行。

请参阅 herehere 以供参考。

Here是官方的说法

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

【讨论】:

  • 是的,没错,但是当构建解决方案时,无论是否有任何代码更改,所有程序集的清单都会更改。
  • 是的,你是对的。您必须将项目放入不同的解决方案中,并手动更新“主”项目中引用的程序集。我同意这比将它们全部放在一个解决方案中要方便得多。但是 IMO 仍然比在哈希签名发生变化时强制 ClickOnce 进行部分更新要好得多。
  • 对于我们的应用程序,我们还必须在项目设置中设置标志完全信任应用程序以进行部分 dll 更新,而不仅仅是强命名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多