【问题标题】:How can I make my C# application check for updates?如何让我的 C# 应用程序检查更新?
【发布时间】:2009-04-23 07:02:52
【问题描述】:

我正在构建一个 C# windows 应用程序。 我想要它,所以每当我单击表单中的更新按钮时,应用程序都会开始寻找我的服务器上是否有可用的新版本。

如果有则继续更新软件。

这通常是如何处理的?

【问题讨论】:

    标签: c#


    【解决方案1】:

    看看Click OnceThis thread 也可能读起来很有趣。

    【讨论】:

    • ClickOnce 有一个主要缺点 - 它会在启动您自己的应用程序之前弹出自己的窗口,这对于初次使用的用户来说是丑陋且令人困惑的。它应该像 Firefox 或 Reflector 一样工作......
    • 我读到你可以改变这种行为,例如:bloggingabout.net/blogs/dennis/archive/2007/11/05/…
    • @Krzysztof,它不需要这样做。这完全取决于您如何配置和构建更新解决方案。您可以在应用程序中编写所有 clickonce 交互,而无需框架提供的对话框。
    【解决方案2】:

    首先我要说的是,我们提供了一个完整的更新解决方案,其中包括:

    wyUpdate 处理所有 Vista/Windows 7 UAC 问题以及在您尝试更新复杂软件时不可避免地出现的所有文件权限问题。

    话虽如此,如果您想构建自己的更新程序,这里有一些提示:

    构建您自己的更新程序

    我上面提到的wyUpdate C# source code 是一个很好的起点。您可以将其蚕食并将其用于您自己的目的。它包含的一些算法:

    • 完整的 Windows Vista / Windows 7 UAC 支持
    • 受限用户能够检查并更新他们是否拥有凭据
    • 支持不稳定的企业内部网。 (如果您曾经与一家公司合作过,这是一个真正的问题)。
    • 快速提取、修补和安装文件。
    • 注册支持。
    • 在用户出错或取消时回滚文件和注册表
    • 自我更新(不留下任何文件)

    我们也有file specifications here

    自动更新

    既然自动化是一项要求,让我告诉你我们如何使用我们的AutomaticUpdater control 做到这一点。

    我们使用命名管道在独立更新程序 (wyUpdate) 和位于程序窗体上的自动更新程序控件之间进行通信。 wyUpdate 向 Automatic Updater 报告进度,Automatic Updater 可以告诉 wyUpdate 取消进度、开始下载、开始解压等。

    这使更新程序与您的应用程序分开。

    事实上,我们使用的确切命名管道 C# 代码包含在我不久前写的一篇文章中:Multi-process C# app like Google Chrome

    【讨论】:

    • 我可以保证 wyBuild 和 wyUpdate 是一款出色的产品。它比 ClickOnce 灵活得多,而且非常实惠——软件工程的一个重要方面是知道何时购买以及何时构建,对我来说,这是一个明确的购买决定。
    • 查看这些产品,它们看起来很棒。我只能希望有一天我能使用它们。 :)
    • 我们为开源项目和学校资助的学生项目提供免费许可。见:wyday.com/wybuild/buy/special-prices.php
    【解决方案3】:

    如果您希望您的应用从网站自动更新并自行处理代码,请执行以下步骤:

    1. 创建一个具有唯一名称的 XML 文件,例如 help.xml,并构建一个结构来指定特定目录和版本等中要更新的文件列表。然后将它们上传到您的网站。

    2. 连接到网站后的应用程序下载此help.xml 文件并读取内容以确保有任何 网站上的新文件(更新文件)...

    3. 如果存在新版本的文件,请从help.xml 文件中指定的 URL 开始下载!

    【讨论】:

      【解决方案4】:

      其他答案看起来很棒。

      但是,如果您出于某种原因想要自己动手制作,只需将包含更新过程所需信息的 XML 文件(例如当前可用版本的描述和版本号)放在网络服务器的某个位置并使用HttpWebRequest(或HttpWebClient?)下载此文件并像处理任何 XML 一样处理。

      我在peSHIr Tweets 中使用了这个简单的方法,效果很好。只需在您将新版本在线下载后更新此文件,您的更新检查就会找到它。关于这个过程的任何内容都可以按照您自己的方式进行更改。

      除非这是一个供您自己娱乐/使用/学习的私人项目 - 就像我的情况一样 - 如果有任何可用的东西适合您的需求,请看看!

      【讨论】:

      • 如果有大量用户请求同一个文件,例如:100 个用户运行程序,启动时每个程序发送 100 个请求(版本检查)。这会挂起标准的共享托管服务器吗?
      • 就像我写的:对于简单的东西你可以自己写。这也意味着您必须自己考虑可能出现的问题,在这种情况下您希望发生什么,以及您是否想为此做好准备。我只是告诉你我在我的小众应用中使用了几百个用户..
      【解决方案5】:

      看看:Update Checker,我写它是为了展示在 C# 中实现此功能的简单方法。

      此 XML 文件管理更新:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <myCoolApp>
          <currentVersion>
              <major>9</major>
              <minor>1</minor>
              <build>5</build>
          </currentVersion>
          <path>http://TestApp.exe</path>
      </myCoolApp>
      

      主要函数Check4Update()读取XML文件并解析:

      XmlDocument oDom = new XmlDocument();
      oDom.Load(_sXmlConfig);
      
      string str = oDom.SelectSingleNode("//currentVersion/major").InnerText;
      Int32.TryParse(str, out _nMajor);
      
      str = oDom.SelectSingleNode("//currentVersion/minor").InnerText;
      Int32.TryParse(str, out _nMinor);
      
      str = oDom.SelectSingleNode("//currentVersion/build").InnerText;
      Int32.TryParse(str, out _nBuild); 
      
      _sNewVersionPath = oDom.SelectSingleNode("//path").InnerText;
      

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多