修补申请

时间:2010-04-10 19:48:27

标签: c# diff patch

我需要为我的应用程序创建一个修补例程, 它非常小但我需要每天或每周更新一次 xdelta和其他人如何运作? 我已经读过这些,但我对此并不了解 不应该提示用户

6 个答案:

答案 0 :(得分:1)

这是什么类型的应用程序?也许您可以使用clickonce来部署您的应用程序。 Clickonce非常容易让您将更新推送给用户。

短篇小说是,Clickonce创建一个允许用户从Web服务器或文件共享安装应用程序的安装,启用自动更新,每当您在服务器上放置新版本的应用程序时,应用程序将自动(或要求用户更新)更新应用程序。 clickonce框架负责其余部分 - 获取更新,找出哪些文件已更改,需要再次下载并执行更新。您还可以检查/执行更新programatically

也就是说,clickonce让您无法控制实际的安装过程,而且您无法自由地构建自己的.msi。

答案 1 :(得分:1)

我不会使用补丁解决方案,因为当你进行大量修改时,它确实会让事情变得复杂。修补解决方案如何处理要求更新的不同版本?如果用户A是当前版本后面的10个修订版怎么办?还是100个修改等?最好只下载最新的exe(s)和dll(s)并替换它们。

那就是说,我认为this SO question on silent updates可能对你有帮助。

答案 2 :(得分:1)

有一种高效修补的解决方案 - 它可以在所有平台上运行,并且可以在完全静音模式下运行,而无需用户注意任何事情。在.NET上,它使用自定义UserControl提供seamless integration更新过程,该自定义UserControl以声明方式绑定到您自己的UI中的事件。

它被称为wyUpdate

虽然更新客户端(wyUpdate)是开源的,但使用付费wybuild tool来构建和发布补丁。

答案 3 :(得分:1)

好的,这篇文章在meta上标记了所给出的答案,所以我将对此进行权衡。

xdelta是一个二元差异程序,它不是为您提供完整图像,而是为您提供已更改的内容和位置。文本差异的一个示例将在文本行之前显示+和 - 符号,表明这些已在新版本中添加或删除。

更新二进制映像有两种方法:使用您自己的程序替换它或使用某种形式的程序包管理替换它。例如,Linux系统使用rpm等来推送对包的更新。在Windows环境中,如果您不在公司网络上,则您的选项受到安装的限制。如果是,请尝试WSUS和MSI包装。这会给你一个更轻松的生活,或者像有人提到的那样点击ClickOnce。

如果你不是,你需要记住以下几点:

  • 您需要成为管理员来更新某些文件夹中的任何内容,正如其他人所说的那样。我会强烈鼓励您接受此行为。
  • 如果用户是管理员,您可以提供检查更新。然后,你可以做两件事之一。您可以下载应用程序的全新版本并将其写入硬盘上的映像(即文件 - 记住图像已加载到内存中,以便您可以重新编写自己的程序文件)。然后,您需要告诉用户更新已成功并重新加载程序,因为新图像将不同。
  • 或者,如果考虑带宽,则可以应用差异。可能不是在你的情况下,但你需要从客户端程序知道两个版本之间的差异,以便更新服务器为您提供正确的补丁。否则,差异可能不会成功。

我不认为为了你的目的,xdelta无论如何都会给你带来很多好处。只需替换整个图像。

编辑如果根本不提示用户,只需重新加载该应用即可。但是,我强烈建议告知用户,他们正在通过他们的网络进行通话并请求获得许可/启用手动更新模式,否则像我这样的人会阻止它。

答案 4 :(得分:0)

根据应用程序的大小,您可能会将其拆分为多个dll,exe和其他文件。

您可以做的是让主程序检查更新。如果有可用的更新,主程序将关闭,更新程序将接管 - 更新旧文件,创建新文件,并删除随补丁文件发送的指令所指定的当前文件(可能是压缩格式,如.zip )由更新程序下载。

如果您的应用程序很小(例如,单个exe),只需让updater替换那个exe就足够了。


编辑:

另一种方法是(在编译新的exe时),将新的比较与旧的比较,然后将差异发送到更新程序。然后它会进行适当的调整。

答案 5 :(得分:-1)

您可以使您的函数驻留在单独的DLL中。所以你只需要替换DLL而不是修补整个程序。 (假设Windows是C#程序的目标平台。)