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

42

我所参与的项目不允许使用ClickOnce。我的老板希望程序看起来“真实”(包括安装程序等)。

我已经安装了Visual Studio 2012专业版,并尝试使用InstallShield安装程序,确实可以制作出漂亮的安装程序,但我不知道怎样使应用程序“自动更新”(即启动时检查是否使用了最新版本)。

我被要求对代码进行微小修改——将加法改为减法,但我不希望人们每次像这样进行小的更改时都必须卸载旧版本并重新安装新版本。

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


可能是.NET自动更新库?的重复问题。 - Peter Mortensen
1
你可以使用Google Omaha。这是Chrome使用的工具,它提供了一个漂亮的安装程序和自动更新功能。 - Michael Herrmann
6个回答

37

1
我已经尝试过这个方法——进去更改产品代码。但是当我重新安装时,它会显示正在安装,但实际上程序并没有发生任何变化……有什么想法吗?谢谢 :) - Toadums
是的,它是相同的。显然这与升级路径有关 - 但由于我正在使用限制版,我不确定是否能解决这个问题。 - Toadums
看起来不起作用,按照您的确切步骤操作,仍然只是安装了第二个应用程序。这是最令人沮丧的事情。 - Toadums
感谢所有的帮助!一旦SDK安装完成,我会尝试使用Orca。 - Toadums
您可以尝试重新排序“RemoveExistingProducts” - 这可以在InstallShield的“升级路径”部分中找到。IS提供了一些有关全局程序集缓存和Windows Installer问题的有用信息,它旨在解决这些问题。它还引用了Microsoft Knowledge Base 905238。 - JYelton
显示剩余5条评论

7
我认为您应该检查codeplex.com上的以下项目: http://autoupdater.codeplex.com/ 这个示例应用程序是用C#作为库开发的,项目名称为“AutoUpdater”。DLL“ AutoUpdater”可用于C# Windows应用程序(WinForm和WPF)。
AutoUpdater具有以下特点:
1.易于实现和使用。 2.检查更新后应用程序自动重新运行。 3.更新过程对用户透明。 4.使用多线程下载以避免阻塞主线程。 5.能够升级系统和自动更新程序。 6.不需要更改代码即可在不同系统中使用并编译成库。 7.方便用户下载更新文件。
如何使用?
在要自动更新的程序中,只需在Main过程中调用AutoUpdate函数。AutoUpdate函数将检查版本与位于Web站点/FTP中的文件中读取的版本。如果程序版本低于读取的版本,则程序会下载自动更新程序并启动它,并且函数返回True,这意味着将运行自动更新并应关闭当前程序。自动更新程序从要更新的程序接收几个参数,并执行必要的自动更新,然后启动已更新的系统。
  #region check and download new version program
  bool bSuccess = false;
  IAutoUpdater autoUpdater = new AutoUpdater();
  try
  {
      autoUpdater.Update();
      bSuccess = true;
  }
  catch (WebException exp)
  {
      MessageBox.Show("Can not find the specified resource");
  }
  catch (XmlException exp)
  {
      MessageBox.Show("Download the upgrade file error");
  }
  catch (NotSupportedException exp)
  {
      MessageBox.Show("Upgrade address configuration error");
  }
  catch (ArgumentException exp)
  {
      MessageBox.Show("Download the upgrade file error");
  }
  catch (Exception exp)
  {
      MessageBox.Show("An error occurred during the upgrade process");
  }
  finally
  {
      if (bSuccess == false)
      {
          try
          {
              autoUpdater.RollBack();
          }
          catch (Exception)
          {
             //Log the message to your file or database
          }
      }
  }
  #endregion

4
最常见的方法是在您的 Web 服务器上放置一个简单的文本文件(XML/JSON 更好),其中包含最新构建版本。然后应用程序将下载此文件,检查版本并启动更新程序。典型的文件如下所示:
应用程序更新文件(唯一字符串,让您的应用程序识别文件类型)
版本:1.0.0(最新程序集版本)
下载:http://yourserver.com/...(下载版本的链接)
重定向:http://yournewserver.com/...(我在服务器地址更改时使用了此字段。)
这将让客户端知道他们需要查看新地址。
您还可以添加其他重要细节。

这很有道理。但是当您重新安装时,如何避免出现“此项目的另一个版本已安装...”的消息? - Toadums
根据@JYelton的指示,请保留相同的更新代码。还有其他方法,但我忘记了:( - Samy Arous

2

一个业余的方式是

在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);

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


1
这是更新文件而不是安装的代码。 该程序通过dos制作,用于将文件复制到最新日期并自动运行您的程序。可能会对您有所帮助。
打开记事本并使用扩展名.bat保存以下文件。
xcopy \\IP address\folder_share_name\*.* /s /y /d /q  
start "label" /b "youraplicationname.exe"

0

现在,您可以使用 Windows 10 中的 AppInstaller 机制来打包您的应用程序为 MSIX 包或软件包,以便进行应用程序交付。

有了它,您无需考虑安装程序(如果您的应用程序不使用很多依赖项),后台更新等等。这比 ClickOnce 好得多,由于别名,命令行使用非常顺畅,更新不会干扰用户,并且也可用于后台应用程序。

安装体验也更好:用户只需在 HTML 上单击一个按钮,Windows 就会自动安装该应用程序。

它并不是超级简单的,我会说比 ClickOnce 更复杂,但不像 Wix 那么难。

官方指南不支持.NET Core或.NET 5应用程序,因此您可以参考本文这个优秀的视频这个网站也包含了许多有用的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接