0

リモート サーバーで異なるサイズの実行可能ファイルが利用可能になった場合に、アプリケーションを自己更新させたいと考えています。私が得た問題は、プロセスを強制終了してアプリケーションの実行可能ファイルを置き換えると、それ以上何も起こらないことeprocess.Kill()です。ファイル置換プロセス中にスレッドをフリーズしようとしても、その後は何も実行されません。私が間違っていることはありますか?

これが私のコードです:

            Dim Request As System.Net.WebRequest
            Dim Response As System.Net.WebResponse
            Dim FileSize As Integer
            Request = Net.WebRequest.Create("http://mywebsite.com/File.exe")
            Request.Method = Net.WebRequestMethods.Http.Get
            Response = Request.GetResponse
            FileSize = Response.ContentLength
            Dim mySize As New IO.FileInfo(Application.ExecutablePath)
            If FileSize <> mySize.Length Then                    If File.Exists(tempPath & "\File_tmp.exe") Then
                    File.Delete(tempPath & "\File_tmp.exe")
                End If
                Patcher.DownloadFileAsync(New Uri("http://mywebsite.com/File.exe"), tempPath & "\File_tmp.exe") 'Patcher is defined before, you might think that its not working, but this is just a piece of code, and the new file is downloading properly. The described problem is 
                While Patcher.IsBusy
                    Threading.Thread.Sleep(100)
                End While

                Do While True
                    For Each eprocess As Process In Process.GetProcesses
                        If eprocess.ProcessName = "MyApplication" Then
                            eprocess.Kill()
                        End If
                    Next
                    File.Delete(Application.ExecutablePath)
                    'Copy downloaded file to the application executable path directory
                    File.Copy(tempPath & "\File_tmp.exe", Application.ExecutablePath)
                    Threading.Thread.Sleep(30) 'freeze thread...
                Loop
            End If
4

5 に答える 5

0

私はあなたがバッチファイルを作成する関数を書くと言います

  • あなたのexeの新しいバージョンをダウンロードします
  • アプリを閉じて、exe を新しいもので上書きします。
  • アプリを開きます

次に、アプリの起動時に、そのようなバッチ ファイルを探して消去する必要があります。

于 2019-05-10T15:53:37.963 に答える
0

これを行うための機能が組み込まれています。

ClickOnceを見てください。これにより、更新を行うために別のアプリケーションを用意する必要がなくなり、アプリが起動前または起動後に新しいバージョンをチェックするかどうかなど、最小および推奨バージョンを指定できます。

役に立つかもしれないいくつかのリンク:

http://msdn.microsoft.com/en-us/magazine/cc163973.aspx http://www.codeproject.com/Articles/38546/Click-Once-Deployment-Technique

于 2013-06-27T07:18:41.710 に答える
-1

私は、これがスタックオーバーフローのグーグルでまだトップの結果であるということで、ミックスに私の提案を追加すると思った.

まず..プロジェクトの大部分を変更し、他の手順などが必要になるため、ClickOnceソリューションには耐えられません..だから、10分間調べた後、それを除外しました.

また、更新を処理する別のexeを用意することについても..これは私にとっても理想的ではありませんでした.

基本的に、バージョン情報を保持するための単純な JSON データ ファイルを使用してセットアップ インストール ファイルをホストする Web サイトがあります。これには、http リクエストと json デコードを使用してアプリケーション自体からアクセスし、最新バージョンを照会してアプリの現在のバージョンと比較します。

新しいバージョンが見つかった場合、アプリケーションは新しいインストールのコピーをダウンロードし、一時フォルダー/インストーラー フォルダー内のアプリケーションのメイン ディレクトリ内に配置します。

ダウンロードが完了したら、アプリケーション内からインストーラーを実行し、終了を待ちません。次のようなコードは、アプリケーションの保存と終了機能をトリガーします。

この時点で、インストールは実行されていますが、メイン アプリケーションは終了しています。ここから、インストーラーは通常どおり続行し、完了時にアプリケーションを開始できます。

もちろん、サイレント インストールなど、ここで多くのことを変えることができます..しかし、この方法を使用すると、通常のインストーラーとアプリの exe だけで済ませることができます..

于 2016-07-22T05:45:58.943 に答える