.NET winforms应用程序不使用ClickOnce进行更新的最佳方法是什么?

时间:2020-03-06 14:53:59  来源:igfitidea点击:

由于技术原因,我无法使用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框架从头开始构建更新程序的人有所帮助。

但是,如果需要的话,请把我投反对票。