VB.NET - 打开时自动更新应用程序?

时间:2016-06-03 21:04:49

标签: .net vb.net windows visual-studio cmd

我将代码设置为在运行时使用Form1_Load执行代码是一个简单的程序集检查以查看版本是否低于通过Webclient获得的服务器上保存的版本。从那里,如果它更低,它下载最新的EXE并使用CMD重命名它并用旧的.exe替换它(不知怎的,它在应用程序打开时有效)

问题:

  • 它使虚假反病毒检测器认为它试图感染其他应用程序(Trojan Dropper Variant)

  • 在某些情况下它没有效果(例如:用户第一次下载应用程序并将其重命名为默认EXE名称以外的其他名称,然后繁荣它无法有效工作)

  • CMD甚至可能无法在某些机器上工作,例如School PC的e.t.c

  • 使用CMD通常不是一个好主意。

我不想做的解决方案:

  • 使用第二个.exe,其唯一目的是更新应用程序;

  • CMD Duh

  • Atleast尝试不使用.dll的Nuget包/外部引用

  • 不是仅当用户在MessageBox e.t.c上按是/ OK时更新的代码

那么我该怎么办才能解决必须使用CMD的问题?

我当前的代码:

#Region "Update Checker"

#Region "Test Internet Connection"

    'Ping Google to see if the user has Internet Connected;
    Private Function TestInternetConnection() As Boolean
        Try
            Dim ping As New Net.NetworkInformation.Ping()
            ping.Send("google.com")
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

#End Region

#Region "Check for an Update"

    Private Sub CheckForUpdate()

        'If the user is Connected to the Internet;
        If TestInternetConnection() Then

            Try

                'Using WebClient, get the Newest File Version;
                Using wc As New WebClient

                    'Latest Version;
                    Dim LatestVersion As String = wc.DownloadString("http://proxyfuel.xyz/version.txt")

                    'If the Latest Version is Newer then the Current Version;
                    If LatestVersion > Application.ProductVersion Then

                        'Download the Latest Version of the EXE file;
                        wc.DownloadFile("{Application EXE Direct Link}", Application.StartupPath & "\update.exe")

                        'Execute the CMD Batch File to replace the old EXE file with the Newest EXE file;
                        Process.Start(New ProcessStartInfo("cmd.exe", String.Format("/k {0} & {1} & {2} & {3}", "ping -n 3 127.0.0.1 > NUL", "del ""ProxyFuel.exe""", "REN ""update.exe"" ""ProxyFuel.exe""", "start """" ""ProxyFuel.exe""")).WindowStyle = ProcessWindowStyle.Hidden)

                        'Close the Application;
                        Application.Exit()

                    Else

                        'Start Loading the Main Form;
                        My.Settings.updatechecked = True

                    End If

                End Using

            Catch ex As Exception

                'Updating had an Unexpected Error;
                MessageBox.Show(ex, "Update Error!", MsgBoxStyle.Critical)

            End Try

        Else

            'No Internet Connection - Couldnt connect to the Data Server;
            MessageBox.Show("Internet Connection Required!", "Error")

        End If

    End Sub

#End Region

#End Region

1 个答案:

答案 0 :(得分:0)

我有类似的情况需要更新当前正在运行的应用。我创建了一个中间应用程序来重命名(更新),这样主应用程序可以成功重命名,否则当主应用程序仍在运行时,文件将被锁定以进行大多数文件操作。

  1. 说,我的主应用程序是[main],更新程序是[更新程序]
  2. [main]将检查是否有更新的版本
  3. [main]将以不同名称下载[main-new]
  4. [main]将运行[updater]并关闭/退出
  5. [updater]将从[main-new]重命名为[main]
  6. [updater]成功后,运行[main]并关闭/退出
  7. *注: 您不必使用CMD重命名文件,请使用:

    My.Computer.FileSystem.RenameFile("C:\Test.txt", "SecondTest.txt")
    

    *来自Rename File

    希望这有帮助。