.NET winforms应用程序在不使用ClickOnce的情况下更新自身的最佳方法是什么?

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

我认为Updater Application Block是ClickOnce的先驱。 可能值得调查。 查看其源代码可能足以引发一些想法。

我们有一个商业/开源的产品: wyBuild和wyUpdate 。 它具有修补function,使用简单。

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

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

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

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

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

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

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

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

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

写你自己的。

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

既然我还没写过(虽然它在我的名单上),我可以给你一些我想到的东西。 保持准确的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部署function将文件放到设备上(您现在可以使用Sync Framework),我们有一个单独的exe来解压缩CAB并更新文件。

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

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

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

这样您运行更新程序,无论是否更新应用程序,然后运行应用程序,作为正常操作的一部分,它将检查更新的更新程序并对其进行修补。