.NET winforms应用程序不使用ClickOnce进行更新的最佳方法是什么?
由于技术原因,我无法使用ClickOnce自动更新.NET应用程序及其程序集。在.NET中处理自动更新的最佳方法是什么?
解决方案
我认为Updater Application Block是ClickOnce的先驱。可能值得调查。查看其源代码可能足以激发一些想法。
写你自己的。
我听说他们第一次很难写,但是之后变得很简单。
由于我还没有写过(虽然已经写在清单上),所以我可以给我们一些我想过的东西。保持准确的dll版本,因为这对于自我更新很重要。并确保更新程序可以自我更新。
在Program.cs文件中执行以下操作:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Update(); Application.Run(new Form1()); } private static void Update() { string mainFolder; string updateFolder; string backupFolder; foreach (string file in System.IO.Directory.GetFiles(updateFolder)) { string newFile = file.Replace( updateFolder, mainFolder); if (System.IO.File.Exists(newFile)) { System.IO.File.Replace(file, newFile, backupFolder); } else { System.IO.File.Move(file, newFile); } } }
此外,必要时可以递归选择目录结构。这将允许我们更新项目中的任何.dll。实际上,所有内容都在主.exe之外。然后,在应用程序中的其他位置,我们可以处理从服务器(或者任何地方)获取需要更新的文件,然后将其放在updateFolder中,然后重新启动应用程序。
大约3-4年前,我发布了一个位于应用程序外部的示例,如果检测到更新,则应用程序将调用updater ans关闭,然后完成更新,然后重新启动应用程序。
我将示例发布在旧的GotDotNet网站上...我将不得不尝试查找它。
它工作完美,大约需要1-2个小时来编写。
Indigo Rose有一款名为TrueUpdate的产品,也可以为我们完成此操作。我过去曾在托管和非托管应用程序中使用过它们。它基本上是我们放置在服务器上的文件(http,ftp,随便什么)。然后,我们调用客户端EXE以检查更新。更新文件被拉出,并具有检测客户端上哪个版本的逻辑(选择,DLL检测,注册表项读取等)。然后它将找到合适的更新程序并下载文件以执行。它也可以通过代理很好地工作。
他们唯一不做的事情实际上是为我们构建补丁。我们必须手动执行此操作,或者使用其拥有的其他产品执行此操作。这是一个商业解决方案,即使我们需要它也可以很好地工作。
很久以前,在一个使用.NET Compact Framework 1.0的项目中,我编写了一个自动更新应用程序。我们使用SqlCE的CAB部署功能将文件下载到设备上(现在将使用Sync Framework),并且我们有一个单独的exe文件来解压缩CAB并更新文件。
更新将如下所示:将提示用户进行更新,单击按钮并退出UI应用程序。更新程序exe将接管工作,从服务器获取cab文件,备份当前dll,并使用wceload解压缩cab文件。然后,UI将重新启动,如果失败,则更新将回滚。在紧凑型设备上,这仍然是一个有趣的场景,但是现在有比sqlce更好的工具。
如果没有clickonce选项,我当然会看一下更新程序应用程序块和同步框架来实现。但是我猜测我们仍然需要一个单独的可执行文件,因为要覆盖的dll在被exe使用时可能被文件锁定,就像前面已经回答的问题之一一样。
作为滚动自己的起点,可能值得阅读Alex Feinman在MSDN上的文章"使用.NET Compact Framework创建自更新应用程序"。
我编写了自己的自动更新程序,该自动更新程序对应用程序使用了一个公共配置文件,该文件包含用于从以下位置下载最新版本/检查是否需要更新的URL。
通过这种方式,我们可以运行更新程序,该更新程序可以更新应用程序或者不更新应用程序,然后运行该应用程序,作为正常操作的一部分,该程序检查更新的更新程序并对其进行修补。
我们有一个商业/开源产品:wyBuild和wyUpdate。它具有修补功能,使用起来非常简单。
编辑:我被否决了,但我的帖子不只是公然出售。我们的更新程序wyUpdate是开源的,用Cand编写,已获得BSD许可。
我认为这可能对尝试使用.NET框架从头开始构建更新程序的人有所帮助。
但是,如果需要的话,请把我投反对票。