【问题标题】:How to overwrite Files for Update Procedure如何覆盖更新程序的文件
【发布时间】:2015-10-10 18:10:30
【问题描述】:

我正在尝试在 VB.NET 中为我的应用程序创建更新程序,不,我不想使用 clickonce,这很糟糕,因为我必须处理管理自签名证书等问题。

我知道检查新更新文件的代码:

http://pastebin.com/ZjYBWABu

我也知道用于指定这些文件下载到何处的代码,问题是我不想只下载 1 个 .exe...我想下载我将上传到我的服务器的所有最新构建文件,其中我会从我项目的 Bin\release 文件夹中获取。

然后,当更新程序将文件下载到目录时,它会转到应用程序的目录,并以某种方式覆盖/替换所有已更改的文件...也许通过使用哈希或其他方式?

我不知道该怎么做。我所知道的是这个。

更新程序和主应用程序必须分开,以便更新程序可以在应用程序关闭时进行替换,这样它就不会出现文件使用错误。更新程序完成后,它将从新的 exe 启动主应用程序。

在此不胜感激,谢谢各位。

【问题讨论】:

  • 呃,所以因为您认为您在使用自签名证书时遇到了问题,所以您会走上自己重写所有这些的道路吗?您对证书有什么具体问题?
  • 让我们忘记点击一次。如果您能帮助我解决我提出的问题,那就太好了
  • 您的问题到底是什么?如果更新程序知道应用程序的安装位置并且在某些情况下正在运行提升,它应该能够替换文件。

标签: vb.net updates auto-update


【解决方案1】:

我目前正在开展一个项目,我必须为该项目实施类似的更新方法。这个项目很长,需要一些时间才能完成。但这就是我计划应用更新的方式:

  1. 应用程序有两个主要部分Launcher(主应用程序)和Updater(从服务器下载文件并用新文件替换它们然后启动新文件)
  2. 应用程序可以选择手动检查更新,也可以在启动时检查更新。
  3. 如果有可用更新,它会要求用户现在或以后应用更新。
  4. 如果用户选择现在应用更新,则 Updater 应用程序在单独的进程中执行,然后 Launcher 应用程序是 从启动器的代码中关闭。我有以下方法从第一个程序中启动另一个程序然后退出:
    • 使用 Process.Start 从启动器中直接执行更新程序
    • 如果这导致问题,则作为第二种方法,从 Process.Start 启动命令提示符,从命令提示符执行另一个程序(更新程序),关闭命令提示符,然后退出启动器。
  5. Updater 应用程序随后从服务器下载所有相关文件,完成后旧应用程序文件被替换为新文件。

    • 来自服务器的更新可用性信息将包括应用程序的新版本号。为了提供所有文件以供更新,我将将所有文件压缩(zip)到一个名为 Application.Version_No(由服务器提供)的文件中
    • 下载完成后将它们解压缩(解压缩)到名为相同 Application.Version_No 的文件夹中。
    • 解压后这个(Application.Version_No)文件夹中的所有文件将被复制到应用程序的Bin文件夹中。
  6. 新应用 Launcher 文件在单独的进程中执行Updater应用关闭从 Updater 的代码中。

我还没有尝试过这种情况,因为目前我的重点是完成主应用程序,但这肯定会奏效。

更新:

检查更新的另一种方法是使用类似应用程序启动的引导程序。它将是程序的主要入口点。执行后,它将检查更新,如果没有更新,则执行启动器,否则它将下载文件,替换旧文件,然后执行新/更新的启动器。

用于复制/覆盖文件

  • 一种方法是在压缩(zip)文件中只包含那些需要替换为旧文件的文件,然后在下载完成后直接解压到 Bin 文件夹或解压到指定文件夹然后将它们全部复制到 Bin 文件夹中。
  • 作为另一种看起来有点冗长的方法,可以准备一个额外的帮助文件(XML、文本或任何其他格式)以供下载。
    • 此帮助文件包含更新文件的信息,例如每个文件的版本号、要复制这些文件的位置等。
    • 可以将文件下载到名为新应用程序版本的特定文件夹中。
    • 将所有必需文件下载到特定文件夹后,处理帮助文件中提到的每个文件。将每个旧文件的版本与新下载的文件进行比较。如果它是最新的,则将其替换到帮助文件中提到的文件夹中。
    • 作为所有下载之间的另一个步骤,可能会在复制和替换之前进行验证。

【讨论】:

  • 我的问题是我不知道如何编写覆盖代码
  • @UriahsVictor 您可以循环处理下载文件的目录/文件夹,并将它们全部复制到应用程序的 Bin 文件夹中。更多详情请参考msdn.microsoft.com/en-us/library/…
  • @UriahsVictor 或者,您可能在下载中也有一个特定的文本文件,其中包含有关源文件及其目标文件夹的信息。从代码中读取该文件并使用前面评论中提到的方法实现
  • 我知道我需要使用的逻辑,遗憾的是我在将代码放在一起时遇到了麻烦,到目前为止我有下载文件的代码,我也在考虑下载一个 zip 文件这一点我仍在试图弄清楚复制和覆盖代码。在您的应用程序中,您会覆盖所有内容吗?或者你会使用某种哈希值来查看哪些文件发生了变化?
【解决方案2】:

构建了一个带有守护进程的更新程序。这里的主要项目:

https://github.com/UVLabs/dotNetUpdatify

应该有一种方法可以消除对守护进程的使用,如果我弄清楚了,我会更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多