【问题标题】:How patching or updating of the compiled application works?已编译的应用程序的修补或更新如何工作?
【发布时间】:2010-02-11 19:30:45
【问题描述】:

您能否帮助您大致了解在代码级别对已编译和实时应用程序应用补丁或更新是如何工作的?

我的意思是,如果我们想修复某些代码中的错误(或改进功能),那么已经编译的代码会发生什么,它是如何改变的?

【问题讨论】:

  • 是什么让您认为正在使用修补程序?您是在谈论 ASP.NET 影子程序集吗?
  • 现在已经很少找到正在使用的补丁了;带宽和媒体非常便宜,简单地重新分配新组件更容易。一个值得注意的例外是那些巨大的打包游戏数据/媒体文件。
  • @Aaronaught:安全更新是相关的。
  • @nobugz 我说的很笼统,老实说我不太明白你的问题(由于不太了解修补、更新或对已编译代码进行任何更改的机制。如果是只是替换二进制文件然后我就明白了)
  • @Vinko Vrsalovic 能否请您具体说明,在更新时出于安全考虑,您的意思是什么?

标签: c# .net compilation patch


【解决方案1】:

你所说的是用二进制差异算法完成的。

这样的算法会找到现有二进制文件和目标二进制文件之间的差异。这通常比再次发送整个文件的空间要少得多,因此速度更快。如果您推送的更新与安全相关,则速度是相关的,因为客户端获得补丁的速度越快,利用的机会窗口就越少。

请参阅thisthis,了解最新和最出色的已编译可执行文件的二进制差异算法实现。

【讨论】:

  • 感谢您提供详细信息,+1。所有这些可以总结如下:更新应用程序的一般惯例只是替换可执行文件,但有时有人(例如谷歌)使用更高级的方式来查找和替换仅不同的部分代码?
  • 是的,除了替换不是“代码的一部分”,而是二进制文件的一部分。此外,正如 Aaronaught 所说,游戏发行商通常以这种方式分发补丁,Adobe IIRC 也是如此。所以它比你想象的更常见。尤其是当您有大量数据和/或大量客户端要向其推送更新时。
【解决方案2】:

您很可能只需将二进制文件替换为新的编译版本,并确保它们仍然可以与所有依赖库一起使用。

【讨论】:

  • 谢谢托马斯,+1。因此,如果我分发了某个应用程序的 Service Pack 并且它的大小为 1 gb,这并不意味着所有这些 1 gb 的数量都发生了变化,而只是说这是整个可执行文件的另一个副本,以前已安装,仅包含一些更改?
  • 这取决于应用程序,但很可能是这种情况。通常可执行文件没有 1 giga,因此服务包只能替换相关库和可能的可执行文件,它可能仍然比包含所有资源的应用程序大小要小得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2018-01-16
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多