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