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

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

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

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

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

关于这个问题已经有很多问题,所以我会把你推荐给那些人。

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

一些参考:

  • 自动更新.NET应用程序
  • .NET自动更新库?
  • WinForms应用程序的自动更新
  • 建议一种自动更新我的C#程序的方法
  • 自动更新Windows应用程序

我想你应该在codeplex.com上查看以下项目http://autoupdater.codeplex.com/

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

AutoUpdater有一些特性:

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

如何使用?

在您想要自动更新的程序中,您只需要在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 

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

应用程序更新文件//允许应用程序识别文件类型的唯一字符串

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

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

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

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

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

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

 xcopy \\IP address\folder_share_name\*.* /s /y /d /q start "label" /b "youraplicationname.exe" 

一个莱男人的方式是

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

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