如何在没有ClickOnce的情况下自动更新应用程序?

时间:2012-10-08 18:57:16

标签: c# deployment

对于我正在处理的项目,我不允许使用ClickOnce。我的老板希望程序看起来“真实”(使用安装程序等)。

我已经安装了Visual Studio 2012 Professional,并且一直在使用InstallShield安装程序,它肯定会成为很好的安装程序,但我无法弄清楚如何启用应用程序“自动 - 更新“(即,启动时,检查以确保它使用的是最新版本)。

我被要求对代码做一个小小的改动 - 将一个加法转换为减法,我真的不希望人们必须卸载旧版本,然后每次我都要重新安装新版本像这样做一个小小的改变。

如何让应用程序检查更新并安装它们?或者这不可能(或不容易)?

6 个答案:

答案 0 :(得分:20)

关于此问题已经有很多问题,所以我会将您推荐给那些人。

您希望确保避免卸载的一件事是您在每个版本上使用相同的升级代码,但更改产品代码。这些值位于Installshield项目属性中。

一些参考文献:

答案 1 :(得分:4)

我认为您应该在codeplex.com上查看以下项目 http://autoupdater.codeplex.com/

此示例应用程序在C#中作为库创建,项目名称为“AutoUpdater”。 DLL“AutoUpdater”可以在C#Windows应用程序(WinForm和WPF)中使用。

有关AutoUpdater的某些功能:

  1. 易于实施和使用。
  2. 检查更新后应用程序自动重新运行。
  3. 更新对用户透明的流程。
  4. 避免使用多线程下载阻止主线程。
  5. 能够升级系统以及自动更新程序。
  6. 不同系统使用时不需要更改的代码 可以在库中编译。
  7. 用户可以轻松下载更新文件。
  8. 如何使用?

    在您想要自动更新的程序中,您只需要在Main过程中调用AutoUpdate函数。 AutoUpdate函数将使用从Web站点/ FTP中的文件读取的版本来检查版本。如果程序版本低于读取的程序版本,程序将下载自动更新程序并启动它并且该函数返回True,这意味着将运行自动更新并应关闭当前程序。自动更新程序从要更新的程序接收若干参数,并执行必要的自动更新,然后启动更新的系统。

      #region check and download new version program
      bool bHasError = false;
      IAutoUpdater autoUpdater = new AutoUpdater();
      try
      {
          autoUpdater.Update();
      }
      catch (WebException exp)
      {
          MessageBox.Show("Can not find the specified resource");
          bHasError = true;
      }
      catch (XmlException exp)
      {
          bHasError = true;
          MessageBox.Show("Download the upgrade file error");
      }
      catch (NotSupportedException exp)
      {
          bHasError = true;
          MessageBox.Show("Upgrade address configuration error");
      }
      catch (ArgumentException exp)
      {
          bHasError = true;
          MessageBox.Show("Download the upgrade file error");
      }
      catch (Exception exp)
      {
          bHasError = true;
          MessageBox.Show("An error occurred during the upgrade process");
      }
      finally
      {
          if (bHasError == true)
          {
              try
              {
                  autoUpdater.RollBack();
              }
              catch (Exception)
              {
                 //Log the message to your file or database
              }
          }
      }
      #endregion
    

答案 2 :(得分:2)

最常见的方法是使用最后一个构建版本在您的网络服务器上放置一个简单的文本文件(XML会更好)。然后,应用程序将下载此文件,检查版本并启动更新程序。典型的文件如下所示:

应用程序更新文件 //一个唯一的字符串,让您的应用程序识别文件类型

版本:1.0.0 //最新汇编版本

下载:http://yourserver.com/ ... //指向下载版本的链接

redicrect:http://yournewserver.com/ ... //我在服务器地址发生变化时使用了这个字段。这会让客户知道他们需要查看新地址。

您还可以添加其他重要细节。

答案 3 :(得分:1)

这是更新文件但不安装的代码 该程序通过dos将文件复制到最新日期并自动运行程序。可以帮到你

打开记事本并使用ext .bat

保存下面的文件
xcopy \\IP address\folder_share_name\*.* /s /y /d /q  
start "label" /b "youraplicationname.exe"

答案 4 :(得分:1)

A Lay men的方式是

on Main()将执行的程序集文件.exe重命名为其他东西 检查创建的日期和时间。 和更新的文件日期时间并复制到应用程序文件夹。

//Rename he executing file
System.IO.FileInfo file = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);

System.IO.File.Move(file.FullName, file.DirectoryName + "\\" + file.Name.Replace(file.Extension,"") + "-1" + file.Extension);

然后进行逻辑检查并将新文件复制到执行文件夹

答案 5 :(得分:-1)

如今,您可以通过将您的应用打包到 MSIX 捆绑包或包中,使用包含在 Windows 10 中的称为 AppInstaller 的应用交付机制。

有了它,您就不必考虑安装程序(如果您的应用程序不使用大量依赖项)、后台更新等等。它比 ClickOnce 好得多,由于别名的存在,命令行使用就像一种魅力,更新不显眼,也可用于后台应用程序。

安装体验也好得多:用户只需要点击 HTML 上的一个按钮,Windows 就会自动安装应用程序。

它不是超级简单,我会说比 ClickOnce 更复杂,但没有 Wix 难。

Official guide 不适用于 .NET Core 或 .NET 5 应用程序,因此您可以参考 this articlethis great video,例如。 This site 还包含很多有用的信息。