【问题标题】:How to update application files using patching?如何使用补丁更新应用程序文件?
【发布时间】:2025-12-19 22:50:06
【问题描述】:

对任何自动更新解决方案感兴趣,例如 ClickOnce 或 MS Updater Block。对于任何想问为什么不的人:我已经在使用这些并且它们没有任何问题,我只是想了解任何有效的替代方案。

我想发布 补丁 = 将修改现有部署文件的小差异,以尽可能小的增量。不仅代码需要打补丁,资源文件也需要打补丁。可以通过维护两个独立的部署同步副本来修补正在运行的代码(不需要对正在运行的可执行文件进行动态更改)。

应用程序本身可以进行 xcopy 部署(以避免 MSI 自动更正修改的文件或破坏 ClickOnce 签名)。

  • 我想学习如何处理不同版本的补丁(例如,发布了一个修复一个错误的补丁,然后又发布了另一个修复另一个错误的补丁(在同一个文件中) - 用户可能有以下任意组合这些还有第三个补丁 - 在文本文件中,这可能很容易实现,但是可执行文件呢?(本机 Win32 代码与 .NET,有什么区别?)

  • 如果第一个问题太难解决或无法解决可执行文件,我想至少了解是否有一个解决方案可以通过串行修订实现简单修补 - 为了安装修订 5,用户必须具有安装所有以前的版本以确保部署的有效性。

  • 补丁可以作为可从网站下载的文件发布 - 不需要直接从正在运行的应用程序中进行自动补丁功能。

是否有任何现有的解决方案可以做到这一点?

注意:关于 SO 的一些问题可能看起来像是重复的,但没有一个能给出好的答案。

这个问题是关于 Windows 平台的,最好是 .NET。

到目前为止,wyUpdate 似乎最适合这个问题。仍然对替代品感兴趣。

【问题讨论】:

  • 非常感谢 wyUpdate 的链接,我一直在寻找这样的好图书馆!

标签: windows deployment diff patch


【解决方案1】:

您将无法创建一个可以应用于多个版本的程序的二进制补丁,因此以下情况是不可能的:

      org+p1
     /      \
    + p1     +p2    <-- note, p2 is the same patch both places
   /          \
original       org+p1+p2
   \          /
    + p2     +p1    <-- ie. the p2 on this line is the same as the one above
     \      /
      org+p2

你会遇到这种情况:

      org v.2
     /      \
    +p1      +p4    <-- note, different patches now
   /          \
org v.1        org v.4
   \          /
    +p2      +p3
     \      /
      org v.3

如果您想让您的用户挑选他们想要应用的修复程序,您应该很容易看到这变得多么复杂。是的,这可以用文本文件来完成,毕竟,大多数源代码控制工具就是这样进行分支和合并的,但它们的工作基础是您可以在文件中插入和删除内容而不会影响文件的其余部分,并且不适用于可执行文件。

注意:一种特殊情况是修复替换字节,但不插入或删除文件中的任何内容。只要多个此类修复不重叠,就可以挑选您要应用的修复。但是,这样的补丁非常罕见。

正如您在问题中所暗示的那样,您应该使用串行时间线,可能对现有版本使用单个修补程序,因此您可能有这个:

                                      +-- most up to date version
                                      |            
                                      v
org v.1         org v.3             org v.4
   \           /       \           /
    +p1       +p2       +p3       +p4
     \       /           \       /
      org v.2             org v.4
       \
        +p1.1
         \
          org v.2 hotfix 1

至于实际代码,我有一个差异/补丁实现,但它可能远非最佳。目前,为任何大型文件生成补丁文件都需要 很多 时间。补丁相当小,但我敢说其他算法会产生更好的补丁。使用bsdiff and bspatch 的样本测试会产生更小的补丁。

但是,如果您想玩它,代码是here。它是一个更大的类库的一部分,我不记得你需要多少(库的其余部分)来编译二进制补丁类,但它都在那里。您要使用的类是Delta2 类。

【讨论】:

  • 感谢您的详细分析以及指向您的 delta 实现的链接。我会研究代码并尝试从中学习。