41

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

我已经安装了Visual Studio 2012 Professional,并且一直在使用InstallShield安装程序,它确实是很好的安装程序,但我不知道如何使应用程序“自动更新”(即,当它启动时) up,检查以确保它使用的是最新版本)。

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

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

4

6 回答 6

35

已经有很多关于这个的问题,所以我会向你推荐这些。

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

一些参考资料:

于 2012-10-08T19:02:22.827 回答
6

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

此示例应用程序使用 C# 开发为项目名称为“AutoUpdater”的库。DLL “AutoUpdater”可用于 C# Windows 应用程序(WinForm 和 WPF)。

AutoUpdater 有一些特性:

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

如何使用?

在您想要自动更新的程序中,您只需要在 Main 过程中调用 AutoUpdate 函数即可。自动更新功能将使用从网站/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
于 2014-05-02T00:34:58.303 回答
4

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

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

版本:1.0.0(最新汇编版本

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

重定向:http: //yournewserver.com/ ...(我使用此字段以防服务器地址更改。

这会让客户知道他们需要寻找一个新地址。

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

于 2012-10-08T19:04:59.177 回答
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);

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

于 2015-01-29T17:17:00.743 回答
1

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

打开记事本并使用 ext .bat 保存下面的文件

xcopy \\IP address\folder_share_name\*.* /s /y /d /q  
start "label" /b "youraplicationname.exe"
于 2013-02-13T04:48:01.857 回答
0

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

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

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

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

官方指南不适用于 .NET Core 或 .NET 5 应用程序,因此您可以参考这篇文章这个精彩的视频,例如。该站点还包含许多有用的信息。

于 2021-05-21T11:52:13.720 回答