Application Auto Update in VB.NET

Started by dhilipkumar, Oct 10, 2008, 09:09 PM

Previous topic - Next topic

dhilipkumar

Introduction

This code enables an application to update itself when there is a new version available. The auto update is transparent to the user and checks for new updates every time the user launches the program. This code was written to be used in a controlled environment (intranet) and is not intended to be used through the internet due to security issues.

Background

I've been developing client/server systems for a long time, and the worst part of the software life cycle is to update it in all users' machine. The worst scenario is when you need to make a database change, and all the users are required have the latest version, otherwise the system will crash.

Today a lot of systems offer the ability to auto update, what makes the programmer's and the user's life easier. Looking through the internet, I couldn't find any code that I could use in my projects in a simple way, so I decided to write my own code.

Some points that I'd like to have in an auto update program are:

Easy to implement and use.
Transparent to the user.
Ability to upgrade the system and also the auto update program.
A code that doesn't need change when used by different systems and could be compiled in a library.
How it works

In the program that you want to be auto updateable, you just need to call the AutoUpdate function in the Main procedure. The AutoUpdate function will check the version with the one read from a file located in a web site. If the program version is lower than the one read the program downloads the auto update program and launches it and the function returns True, which means that an auto update will run and the current program should be closed. The auto update program receives several parameters from the program to be updated and performs the auto update necessary and after that launches the updated system.

The code

The auto update program

This is the code for the auto update program. The program is a windowless application with only one Main procedure. Here the only change that needs to be made is the error message at the end:


Imports System.IO
Imports System.Net

Module Main

    Public Sub Main()
        Dim ExeFile As String ' the program that called the auto update

        Dim RemoteUri As String ' the web location of the files

        Dim Files() As String ' the list of files to be updated

        Dim Key As String ' the key used by the program when called back

                          ' to know that the program was launched by the

                          ' Auto Update program

        Dim CommandLine As String ' the command line passed to the original

                                  ' program if is the case

        Dim myWebClient As New WebClient ' the web client

        Try
            ' Get the parameters sent by the application

            Dim param() As String = Split(Microsoft.VisualBasic.Command(), "|")
            ExeFile = param(0)
            RemoteUri = param(1)
            ' the files to be updated should be separeted by "?"

            Files = Split(param(2), "?")
            Key = param(3)
            CommandLine = param(4)
        Catch ex As Exception
            ' if the parameters wasn't right just terminate the program

            ' this will happen if the program wasn't called by the system

            ' to be updated

            Exit Sub
        End Try
        Try
            ' Process each file

            For i As Integer = 0 To Files.Length - 1
                Try
                    ' try to rename the current file before download the new one

                    ' this is a good procedure since the file can be in use

                    File.Move(Application.StartupPath & "\" & Files(i), _
                        Application.StartupPath & "\" & _
                        Now.TimeOfDay.TotalMilliseconds & ".old")
                Catch ex As Exception
                End Try
                ' download the new version
                myWebClient.DownloadFile(RemoteUri & Files(i), _
                    Application.StartupPath & "\" & Files(i))
            Next
            ' Call back the system with the original command line
            ' with the key at the end
            System.Diagnostics.Process.Start(ExeFile, CommandLine & Key)
            ' do some clean up -  delete all .old files (if possible)
            ' in the current directory
            ' if some file stays it will be cleaned next time
            Dim S As String = Dir(Application.StartupPath & "\*.old")
            Do While S <> ""
                Try
                    File.Delete(Application.StartupPath & "\" & S)
                Catch ex As Exception
                End Try
                S = Dir()
            Loop
        Catch ex As Exception
            ' something went wrong...
            MsgBox("There was a problem runing the Auto Update." & vbCr & _
                "Please Contact [contact info]" & vbCr & ex.Message, _
                MsgBoxStyle.Critical)
        End Try
    End Sub
End Module