小型软件补丁如何纠正大型软件?
我一直想知道的一件事是软件修补程序是如何工作的。许多软件似乎只是在二进制文件上发布了需要安装在较旧版本上的新版本,但是某些软件(尤其是诸如Windows之类的操作系统)似乎能够发布很小的补丁来纠正错误或者为现有功能添加功能软件。
在大多数情况下,我看到的补丁无法替换整个应用程序,甚至无法替换应用程序内使用的小文件。在我看来,实际的二进制文件似乎正在被修改。
这些补丁实际上是如何实现的?谁能指出我的任何资源来解释其工作原理,还是就像替换应用程序中的链接库之类的小组件一样简单?
我可能永远不需要以这种方式进行部署,但是我很想知道它是如何工作的。如果我的理解是正确的,补丁实际上只能修改二进制文件的一部分,那么在.NET中可以做到吗?如果是我想学习它,因为这是我最熟悉的框架,并且我想了解它的工作原理。
解决方案
通常使用二进制diff算法来实现此功能-diff将最新发布的版本与新代码进行比较。如果用户运行的是最新版本,则只需应用diff。对软件特别有效,因为不同版本之间的编译代码通常非常相似。当然,如果用户未运行最新版本,则无论如何都必须下载整个内容。
通用二进制差异算法有两种实现:bsdiff和xdelta是很好的开源实现。我找不到.NET的任何实现,但是由于所讨论的算法与平台无关,因此如果我们觉得自己像一个项目,则将它们移植起来应该不会太困难。
如果我们正在谈论修补Windows应用程序,那么我们要查看的是.MSP文件。这些类似于.MSI,但只是补丁和应用程序。
看一下MSDN文档中的修补和升级。
.MSP文件的作用是将更新的文件加载到应用程序安装中。这通常是更新的dll和资源文件,但可以包含任何文件。
除了修补已安装的应用程序外,位于C:\ WINDOWS \ Installer的修复文件也将更新。然后,如果用户从"添加/删除程序"中选择"修复",则也会使用更新的补丁文件。
我认为John Millikin讨论的二进制diff方法必须在其他操作系统中使用。尽管我们可以使其在Windows中工作,但还是有些陌生。