Application Updater,它还更新相关文件

时间:2014-10-01 13:08:43

标签: c# .net visual-studio-2012 clickonce setup-deployment

好的,所以我已经就这个问题做了很多研究,我似乎无法找到真正有用的东西,所以我希望这里丰富的知识可以帮助你。

背景

我在Visual Studio 2012中开发了一个C#.net应用程序,该应用程序将分发给全国各地的许多计算机。设置应用程序,以便它查看许多设置的.exe.config文件。这不是问题。问题是,我的程序还依赖文件目录,文本和.dll文件。

问题

所以我的问题是,有没有办法在C#中创建一个更新程序以与我的应用程序集成,这样它不仅可以更新.exe,如果有新版本,还可以比较支持文件的版本和必要时更新它们?

此外,是否可以创建一个安装程序来创建这些依赖目录和文件,而无需将它们嵌入到应用程序本身中?

2 个答案:

答案 0 :(得分:2)

我亲自对此进行如下处理:

  • 拥有报告最新版本的网络服务
  • 检查版本(启动时?)以及是否有新版本......
  • 下载清单,列出vNext所需的所有文件/目录,可以从中下载的URL以及文件的一些哈希值(Sha1?)
  • 将您已下载的文件和哈希值与当前磁盘上的内容进行比较
  • 生成需要更新以符合新清单的文件列表,以及不再需要的文件列表
  • 下载新文件
  • 删除上一个清单所需的过时文件(因此不会错误地加载遗留文件)。请务必避免删除用户创建的文件!
  • 在方便的时候,重新启动您的应用程序

通过使用Shadow copied assemblies,您应该能够就地替换框架打开的任何文件,而不必担心锁定。您可能需要处理自己以不同方式打开的文件(例如,如果您在代码中打开文本文件并且需要更新,则需要先关闭句柄)

示例网络服务响应:

/ LatestVersion

{"Version": {"Major": 1, "Minor": 0, "Revision": 0, "Build": 0},
 "Manifest": "/Version/1.0.0.0"}

/Version/1.0.0.0

{"Files": [{"/SomeDll.dll", "Hash": "AAAAAAAAAAAA", "Url": "/Version/1.0.0.0/SomeDll.dll"},
           {"/MainApp.exe", "Hash": "AAAAAAAAAAAB", "Url": "/Version/1.0.0.0/MainApp.exe"},
           ...
          ],
 "ReleaseNotes": "Blah"}

当然,如果应用程序和支持文件的每个版本都很小,您可能只想一次性下载清单和相关文件〜(zip文件?),而不是逐个更新单个文件。

这种方法的另一个好处是,理论上你可以随时前进/后退到你喜欢的任何版本(假设对数据库模式没有依赖性/类似的随时间变化)。

确保安全!

在执行任何自动更新过程时,您需要考虑安全性。您可以有效地下载新代码并使用与应用程序相同的权限运行它(很可能与当前用户相同)。至少,确保您使用SSL并验证您提供的证书!如果您不这样做,则用户和您的服务器之间的任何人都可以替换他们自己的软件。熟悉Man in the Middle攻击的方式,以便你可以防御它们。

答案 1 :(得分:0)

你可以测试Squirrel(一个WiX包装器):

https://github.com/Squirrel/Squirrel.Windows