由于技术原因,我不能使用ClickOnce自动更新我的。净的应用及其组件。什么是最好的方式来处理自动更新。净?

有帮助吗?

解决方案

我认为更新程序应用程序块是一个先兆到ClickOnce。可能值得调查。查看其源代码可能足以引发一些想法。

其他提示

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

编辑:我正在投票给负数,但我的帖子不仅仅是公然出售。我们的更新程序wyUpdate是开源的,用C#编写,并根据BSD许可证授权。

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

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

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

我在旧的GotDotNet网站上发布了这个例子......我将不得不尝试找到它。

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

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

他们唯一不做的事实上是为你构建补丁。您必须手动执行此操作,或使用其他产品执行此操作。如果你需要它,这是一个普遍的解决方案并且工作得很好。

作为一个起点滚你自己,它可能是值得看的 亚历克斯Feinman的文章在MSDN 题为"创造自我更新的应用程序。净契约框架"。

自己写。

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

由于我还没有写过(虽然它在我的名单上),我可以给你一些我想到的东西。保持准确的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并重新启动应用程序。

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

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

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

我编写了自己的autoupdater,autoupdater使用一个公共配置文件到应用程序,其中包含从/ check下载最新版本的URL,如果需要更新。

通过这种方式运行更新程序,无论是否更新应用程序,然后运行应用程序,作为正常操作的一部分,它会检查更新的更新程序并对其进行修补。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top