23

由于技术原因,我不能使用 ClickOnce 自动更新我的 .NET 应用程序及其程序集。在 .NET 中处理自动更新的最佳方法是什么?

4

9 回答 9

16

我们有一个商业/开源产品:wyBuild & wyUpdate。它具有修补功能,并且使用起来非常简单。

编辑:我被选为负数,但我的帖子不仅仅是公然推销。我们的更新程序 wyUpdate 是开源的,用 C# 编写,并在 BSD 许可下获得许可。

我认为它可能会帮助任何尝试使用 .NET 框架从头开始构建更新程序的人。

但是,如果必须,请投票给我。

于 2009-07-04T04:45:29.027 回答
9

我认为更新程序应用程序块是 ClickOnce 的先驱。可能值得研究。查看它的源代码可能足以激发一些想法。

于 2008-09-29T22:35:17.543 回答
2

大约 3-4 年前,我发布了一个位于应用程序外部的示例,如果检测到更新,应用程序调用更新程序并关闭,然后更新完成,应用程序重新启动。

我在旧的 GotDotNet 网站上发布了这个示例……我必须尝试找到它。

它工作得很好,写了大约 1-2 个小时。

于 2008-09-30T13:55:42.293 回答
2

Indigo Rose 有一个名为TrueUpdate的产品,它也可以为您执行此操作。我过去曾在托管和非托管应用程序中使用过它们。它基本上是您放在服务器上的文件(http、ftp,无论您喜欢什么)。然后调用客户端 EXE 来检查更新。更新文件被拉取并具有检测客户端上的版本的逻辑(您的选择、DLL 检测、注册表项读取等)。然后它将为它找到适当的更新程序并下载文件以执行。它也可以通过代理很好地工作。

他们唯一不做的就是为你构建补丁。您必须手动执行此操作,或者使用他们拥有的其他产品。这是一个商业解决方案,但如果你需要它,效果很好。

于 2008-09-30T14:15:27.113 回答
2

作为自己动手的起点,可能值得看看Alex Feinman 在 MSDN 上题为“使用 .NET Compact Framework 创建自我更新应用程序”的文章。

于 2008-11-29T15:09:13.883 回答
1

写你自己的。

我听说他们第一次写有点困难,但之后就变得简单了。

由于我还没有写过(虽然它在我的清单上),我可以给你一些我想到的东西。保持准确的 dll 版本,因为这对于自我更新很重要。并确保更新程序可以自行更新。

于 2008-09-29T22:35:46.343 回答
1

在您的 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 并重新启动应用程序。

于 2008-09-30T00:39:22.833 回答
1

在很久以前的一个项目中,我使用 .NET Compact Framework 1.0 编写了一个自动更新应用程序。我们使用 SqlCE 的 CAB 部署功能将文件放到设备上(您现在将使用 Sync Framework),并且我们有一个单独的 exe 来解压缩 CAB 并更新文件。

更新会是这样:提示用户更新,单击按钮并退出 UI 应用程序。更新程序 exe 将接管,从服务器获取 cab 文件,备份当前 dll 并使用 wceload 解压缩 cab 文件。然后将重新启动 UI,如果失败,则将回滚更新。这在紧凑型设备上仍然是一个有趣的场景,但现在有比 sqlce 更好的工具。

如果 clickonce 不是一个选项,我当然会查看更新程序应用程序块和同步框架来实现这一点。但我猜你仍然需要一个单独的可执行文件,因为你想要覆盖的 dll 可能在 exe 使用时被文件锁定,就像前面已经说过的答案之一一样。

于 2008-09-30T14:25:43.097 回答
1

我编写了自己的自动更新程序,自动更新程序使用一个通用配置文件到应用程序,其中包含从/检查是否需要更新的 URL 下载最新版本。

通过这种方式,您运行更新程序,它要么更新应用程序,要么不更新应用程序,然后运行应用程序,作为正常操作的一部分,它检查更新的更新程序并修补它。

于 2009-02-21T00:48:02.243 回答