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

1

处理此问题的一种方法是在您的项目中创建一个单独的(较小的 exe)来处理新版本的下载。首先,它会关闭当前版本,由于它与原始应用程序无关,因此上传应用程序仍在运行,它会下载、安装它,然后启动新版本。

于 2013-06-27T04:33:14.050 回答
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 回答
0

我说你写了一个函数来创建一个批处理文件

  • 下载新版本的 exe
  • 关闭您的应用程序并用新的覆盖您的 exe。
  • 打开您的应用

然后你的应用程序在启动时应该寻找一个这样的批处理文件并删除它。

于 2019-05-10T15:53:37.963 回答
0

创建一个更新程序,其工作将从远程服务器下载文件,然后将它们复制/移动到您的主应用程序目录中。我已经使用这种方法一段时间了,效果很好。也许这里的这种方法对你有用 https://www.codeproject.com/Articles/35787/VB-NET-Background-File-Downloader

于 2020-10-02T08:39:15.863 回答
-1

我想我会把我的建议添加到混合中,因为这仍然是谷歌对于 stackoverflow 的最高结果。

首先..我无法忍受 ClickOnce 解决方案,因为它修改了项目的大部分内容并需要其他步骤等等..所以我在研究了 10 分钟后排除了这一点。

此外,还有另一个 exe 来处理更新……这对我来说也不理想……所以我让我的主要 exe/setup 安装为我完成了所有这些。

基本上我有一个网站,我在其中托管设置安装文件,其中包含一个简单的 JSON 数据文件来保存版本信息。这是通过应用程序本身使用 http 请求和 json 解码来查询最新版本并将其与应用程序当前版本进行比较来访问的。

如果找到新版本,应用程序将下载新安装的副本并将其放置在应用程序主目录中的临时文件夹/安装程序文件夹中。

下载完成后,我从应用程序中执行安装程序,不要等待退出。下一个类似代码将触发应用程序保存和退出功能。

此时您的安装正在运行,但主应用程序已退出。从这里安装程序可以正常继续并完全启动应用程序。

你当然可以在这里改变很多东西,比如静默安装等等。但是使用这种方法,它可以让我只使用普通的安装程序和应用程序 exe 就可以了。

于 2016-07-22T05:45:58.943 回答