由于技术原因,我不能使用 ClickOnce 自动更新我的 .NET 应用程序及其程序集。在 .NET 中处理自动更新的最佳方法是什么?
9 回答
我们有一个商业/开源产品:wyBuild & wyUpdate。它具有修补功能,并且使用起来非常简单。
编辑:我被选为负数,但我的帖子不仅仅是公然推销。我们的更新程序 wyUpdate 是开源的,用 C# 编写,并在 BSD 许可下获得许可。
我认为它可能会帮助任何尝试使用 .NET 框架从头开始构建更新程序的人。
但是,如果必须,请投票给我。
我认为更新程序应用程序块是 ClickOnce 的先驱。可能值得研究。查看它的源代码可能足以激发一些想法。
大约 3-4 年前,我发布了一个位于应用程序外部的示例,如果检测到更新,应用程序调用更新程序并关闭,然后更新完成,应用程序重新启动。
我在旧的 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 部署功能将文件放到设备上(您现在将使用 Sync Framework),并且我们有一个单独的 exe 来解压缩 CAB 并更新文件。
更新会是这样:提示用户更新,单击按钮并退出 UI 应用程序。更新程序 exe 将接管,从服务器获取 cab 文件,备份当前 dll 并使用 wceload 解压缩 cab 文件。然后将重新启动 UI,如果失败,则将回滚更新。这在紧凑型设备上仍然是一个有趣的场景,但现在有比 sqlce 更好的工具。
如果 clickonce 不是一个选项,我当然会查看更新程序应用程序块和同步框架来实现这一点。但我猜你仍然需要一个单独的可执行文件,因为你想要覆盖的 dll 可能在 exe 使用时被文件锁定,就像前面已经说过的答案之一一样。
我编写了自己的自动更新程序,自动更新程序使用一个通用配置文件到应用程序,其中包含从/检查是否需要更新的 URL 下载最新版本。
通过这种方式,您运行更新程序,它要么更新应用程序,要么不更新应用程序,然后运行应用程序,作为正常操作的一部分,它检查更新的更新程序并修补它。