Strategies For Replacing Program Executable in Win

2019-01-26 16:59发布

问题:

I have a Windows program that needs to update itself from a server automatically.

It is already able to transfer files from the server and update + validate things like DLL plugin files before loading them.

However, this program also needs to update itself. There are probably a few different ways this could be done, and the most obvious one I've seen from various online game clients is creating an "auto patcher" that downloads and then runs the client executable. That introduces the problem of having to update the autopatcher, so if there is a more elegant solution I'd like to hear about it.

I have to imagine there is a way to download what will be the new executable file as a temporary file, let's say "client.exe.tmp" and then launch a separate process that waits for the original client.exe to exit and then renames/copies the new file over the top of it.

Has anyone done this sort of thing before successfully and what method did you use to get it to work?

回答1:

  1. Running exe downloads the new one, puts it somewhere
  2. Running exe renames itself to anything (like .exe.tmp)
  3. Running exe puts the downloaded exe where the running one is (named just like the original)
  4. Running exe starts the downloaded exe
  5. Downloaded exe checks for .exe.tmp file, if found deletes it and kills the old running process
  6. Done


回答2:

I like the patcher/maintenance/feature add/remove tool approach. Even if for some reason you need to update something as trivial, I see no "chicken or egg paradox" here, it is more of a "one hand washes the other" thing.

  1. Application checks server for updates, if any, check if patcher is up to date, if needed, application updates patcher
  2. Patcher is executed as a separate process, downloads the update, and notifies application to prompts to install it
  3. You agree, application quits notifying the patcher, patcher unpacks data, replaces exe, does additional stuff that may be needed by the new version and launches it and terminates


回答3:

Consider ClickOnce deployment which will help you to insall/replace/update latest version from shared location and executed.