【问题标题】:Patching a .NET Application修补 .NET 应用程序
【发布时间】:2011-07-27 17:14:16
【问题描述】:

今天我在远程调试一个客户遇到的问题,我没有构建一个全新的安装并将其发送给他,而是编译了 dll,确保版本信息与他安装的相同,然后替换旧 dll 与我刚刚在他的机器上构建的那个(备份另一个以防万一),一切似乎仍然正常,还有我添加的更详细日志记录的额外好处。

我的问题是:修补软件一般是这样工作的吗?还是我做了一件很危险的事?如果这是解决问题的坏方法,那么将来为我们的软件打补丁以修复错误的最佳方法是什么?

【问题讨论】:

  • 我没有任何复杂的多部署环境修补模型的经验,但你的模型给我敲响了警钟。如果您在本地打过客户的软件补丁,如何使您的补丁也适用于主干和/或客户分支?
  • 嗯,我签入了更改,在这种情况下,这只是节省了大量时间。

标签: .net patch


【解决方案1】:

修补的想法是就地修改产品的现有安装。你如何去做:替换文件、应用二进制差异等并不重要。

您的升级方式很好;除了它不可扩展。如果版本信息相同,则由您手动跟踪客户安装了哪些二进制文件,而不是在“关于”对话框中捕获它。

此外,许多开发商店会归档发送给客户的构建,那么您如何归档此配置?

不是什么大不了的事,但随着您支持更多客户,这会变得很痛苦。

【讨论】:

  • 它适用于他解决问题的情况 - 我认为实际的解决方案将适用于所有客户。
【解决方案2】:

不,这还不错——事实上,DLL应该以这种方式工作。只要您没有破坏 ABI 或 API,(您只是添加了日志记录,这很酷)您应该能够替换下面的内容并重新启动程序。

此外,从法律的角度来看,如果没有这个,LGPL 将无法运行。 (许可证中的一项规定是用户可以用他们构建/提供/查找的库替换您的库副本。)

您可能正在考虑“使用十六进制编辑器进行修补”,您可以在不重新编译的情况下修改二进制文件。那更危险。

【讨论】:

  • 当然,如果我也修改了项目的其他区域,我也会添加其他编译好的dll。我以前从未修补过软件,所以我只是好奇这是否是我为快速修复和类似性质的事情而实施的。
  • 我绝对不会将它用于“快速修复”,但正如 Broam 所提到的,它可以用来解决问题。
【解决方案3】:

好吧,从技术上讲它可以做到,但实际上你可能会迷失在许多客户中,每个客户都有不同的二进制文件,即使版本号也没有区别。

Morover,如果您要修复错误,也许您应该以某种方式更新所有客户。我认为根据应用程序的频繁发布和自我更新功能找到解决方案会更好。

【讨论】:

    【解决方案4】:

    有些版本号由四部分组成:

    主要、次要、构建和修订。

    修订版将用于对修复安全补丁或其他严重问题的产品进行更新。 Firefox 就是一个例子。

    通过您的方法,您似乎没有使用修订版,而是使用了与以前版本相同的主要、次要和内部版本号。为版本号添加修订可以更轻松地确定产品的哪些版本已修补。

    【讨论】:

    • 这就是我们对产品进行版本控制的方式,但我不确定 .NET 运行时是否会抱怨版本不匹配。我只是采取了更安全的路线并使其相同,因为它只是为特定情况添加日志记录。
    • 不管怎样,很高兴知道我仍然可以在补丁上增加我的修订版而不让它破坏应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多