【问题标题】:I don't "get" how a program can update itself. How can I make my software update?我不“明白”程序如何自我更新。如何进行软件更新?
【发布时间】:2010-12-17 10:36:36
【问题描述】:

假设我制作了一个 .exe 文件,一切都很顺利。很好用。

假设我在软件上开发了一项新功能,我希望它可供已经拥有旧版本的人使用,我怎样才能让该软件找到我的新版本,对其进行修补,然后开展业务。

我似乎无法解决这个问题。

谢谢。

编辑: 我很抱歉造成混乱,但我的意思是更符合代码的答案。我的代码中是否有什么特别之处我应该允许更新?

例如,如果我想添加一个新功能,如何在已经打包好的 .exe 中添加一个“方法”? :S 这让我大吃一惊。

【问题讨论】:

  • 您不能将方法添加到已打包的 .exe、.dll 或其他任何内容。您只需将整个文件替换为较新的版本。有一些工具可以比较文件的较旧/较新版本并生成仅包含更改的“补丁”,但这只会有助于减少下载大小,而今天很少有人为此烦恼。最终结果仍然与您只是将新文件复制到旧文件相同。

标签: c# upgrade patch


【解决方案1】:

你需要看Click Once Deployment

ClickOnce 是一种部署技术,使您能够创建自我更新的基于 Windows 的应用程序,这些应用程序可以通过最少的用户交互来安装和运行。如果您使用 Visual Basic 和 Visual C# 开发了项目,Visual Studio 将为发布和更新使用 ClickOnce 技术部署的应用程序提供全面支持。

这会创建一个可下载的安装程序 exe,您可以将其加载到网络上。用户要么就地运行它,要么下载并运行它。这会将您的 exe 包装在代码中,该代码将检查 Web 位置(以您选择的频率)以获取更新。如果它找到一个,它将为用户安装它。

您无需对代码进行任何特殊更改即可启用此功能。除了增加版本号。只需像往常一样修改和扩展您的代码,编译、构建、打包和上传。

需要注意的一点是,虽然 ClickOnce 不支持安装需要管理访问权限的应用程序:

ClickOnce 部署使非管理员用户能够安装并仅授予应用程序所需的代码访问安全权限。

因此,如果您的应用程序需要管理员级别的访问权限才能运行甚至安装,那么它不适合您。

【讨论】:

  • 我们已经在许多拥有 1000 多个用户的应用程序上使用了 Click-Once,它就像一个魅力。
  • 我对 Click-Once 失去了信心。如果它有效,那肯定很好,但是当它失败时,天哪,那就是一团糟。请注意,没有一个“大男孩”使用 ClickOnce(微软甚至不使用它!)
  • 在这一点上,我建议自己滚动。您只需要一种方法来下载新文件,然后用新文件替换当前程序。您会发现与 ClickOnce 中的可怕错误作斗争并不值得。
  • @MarkLakata:在阅读您的 cmets 之前,我对 ClickOnce 感到非常兴奋。 :(
  • 当您的应用程序/exe 需要管理员权限时,ClickOnce 不是解决方案。 `ClickOnce 不支持请求执行级别'requireAdministrator'
【解决方案2】:

从代码的角度来看,我喜欢一种方法,它包含一个名为 IRun 的简单接口和另一个名为 IUpdated 的接口:

public interface IRun()
{
  public void Run();
}

public interface IUpdated()
{
  public void Update();
}

现在我的主应用程序将使用反射加载并“运行”一个库,然后启动真正的应用程序。

主应用程序可执行文件将执行以下步骤:

  1. 读取 updater.cfg,连接到提供的位置并检查 更新程序的更新
  2. 如果有更新,请下载更新后的 dll 和 updater.cfg
  3. 使用反射加载 updater.dll 并启动 Update() 方法。

更新方法对实际应用程序的更新执行相同的步骤。

终于

  1. 加载“core.dll”并启动 Run() 方法。

当然,前提是您想“自己动手”,ClickOnce 实际上也是一个非常好的方法,可能更好,但控制权较少。主应用程序可执行文件足够简单,无需自行更新或无论如何都应该更新。

【讨论】:

  • 如果 C# 代码和实现这一点的技术在任何地方都可以公开获得,我真的很高兴能够研究它们。谢谢,
【解决方案3】:

您不会修改当前的 .exe。

您启动一个单独的进程来下载文件的新版本。新版本替换旧版本。无需修改。

【讨论】:

    【解决方案4】:

    通常流程如下:

    • 用户启动应用程序
    • 应用程序启动“更新程序”(另一个程序)
    • 如果存在较新版本,更新程序将从 Internet 检索
    • 如果是这样,建议用户更新
    • 用户接受,更新程序下载新的安装包(可以是增量的)
    • 更新程序会关闭应用程序(或者更好的是,要求用户这样做)并启动新的安装程序。
    • 安装包完成剩下的工作

    当然你可以有很多变化,但这是基本的方法。

    至少在 Windows 上,某些软件安装了一个更新程序守护程序,该守护程序始终处于打开状态并检查它所关心的软件的新更新(例如 GoogleUpdater)。

    【讨论】:

    • 怎么可能是增量的?如何在 Windows 中使用 Windows Server 和 Windows 7/10 做到这一点?
    • 下载包可能只包含更新的文件(例如 DLL)而不是整个文件集(可能包括图像、声音、.. .)。 如何进行取决于您的应用程序(编写语言、设置“更新”服务器的能力...)
    【解决方案5】:

    让您的应用偶尔通过网络向您的网络服务器发出请求。让该请求返回一个文件,其中包含版本号和指向安装程序最新版本的链接。如果该版本号大于当前运行程序认为的版本号,请让您的程序下载新的安装文件并启动它。

    【讨论】:

    • 这将使我的用户必须卸载,然后将应用程序重新安装到最新版本。不是我真正想要的。
    • 如果您使用的是合理的安装程序,则不会。
    【解决方案6】:

    嗯,通常的方法是您的应用程序定期检查某个地方(通常是在 Internet 上)是否有新版本。这可能发生在每次启动或每周一次或其他任何情况下。

    您可以在此处简单地放置一个包含当前版本号的文本文件。如果该版本比已安装应用程序的版本更新,您可以下载更新程序(不要忘记签名并检查签名)并安装新版本。

    【讨论】:

      【解决方案7】:

      对于windows(通常是由于windows在执行时锁定了.exe文件)

      • 软件确定需要更新
      • 软件运行打包的更新可执行文件(此时软件退出)
      • 更新下载所需的文件到某个临时文件夹中
      • 更新应用补丁
      • 更新重启软件

      【讨论】:

        【解决方案8】:

        一个流行的解决方案是让一个单独的进程替换必要的文件。

        你有没有注意到 Firefox 在更新时必须重新启动?嗯,那是因为一个单独的进程 (updater.exe) 正在下载文件、关闭 firefox、替换文件,然后再次启动 firefox。

        编辑当然,这假设您正在托管更新程序可以检查的在线更新列表(RSS 提要,甚至是简单的文本文件)。

        【讨论】:

        • CCleaner [清理系统的程序],甚至不更新自己。通过单击Update,它只会下载新设置。现在您必须再次手动安装软件,这当然要卸载以前的版本。我不知道为什么 CCleaner 程序员说这是一个更新 ;)
        • 嘿,是的,我想说 CCleaner 采取了更多的“大修”方法。
        【解决方案9】:

        一个想法 - 你可以有一个加载器应用程序为你做检查,然后如果需要在启动它之前更新主应用程序的 exe?

        【讨论】:

        • 然后将一些代码放入下一个版本的主程序中,如果需要,它会在运行时静默执行此操作?
        • 我目前使用这种方法。然而,用户开始将主应用程序固定到 windows7 中的任务栏。然后他们运行它,而不是让加载程序绕过更新过程。
        • 啊,好点子。显然,当我回答这个问题时,Windows 7 才刚刚正式进入零售市场,但却是一个有趣的问题。如果有人还没有问过,值得提问吗?
        猜你喜欢
        • 2015-12-06
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多