2013-05-19 54 views
0

我有一个程序写在VB.Net和这个程序应该自动更新。我已经找到了如何下载新文件并将其解压缩,问题是我无法覆盖文件,只要它在执行中。这是如何正常完成的?我想在一个单独的exe文件上的“更新”,但会有同样的问题,我不能更新更新时,我做了一些更改...VB.Net程序应该自动更新

回答

2

只需关闭旧程序。

保留单独的更新程序,然后当您想更新旧程序时,请更新程序关闭旧程序,然后下载新版本的应用程序。例如,

更新程序,

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Do While True 
     Dim client As New Net.WebClient 
     Dim newVersion As String = client.DownloadString("http://www.myWebsite.com/updates/latestVersion.txt") 
     If newVersion <> IO.File.ReadAllText("Your programs file location") Then 
      For Each p As Process In Process.GetProcesses 
       If p.ProcessName = "your program's process name" Then 'If you don't know what your program's process name is, simply run your program, run windows task manager, select 'processes' tab, scroll down untill you find your programs name. 
        p.Kill() 
       End If 
      Next 
      IO.File.Delete("old program file location") 
      client.DownloadFile("http://www.myWebsite.com/updates/12.05.2013.exe", "where ever you want to download your new program to (file location)") 
      client.Dispose() 
     End If 
     Threading.Thread.Sleep(300000) 'freeze thread for 5 mins... 
    Loop 
End Sub 
+0

谢谢!只有2个小问题:我如何更新更新程序? :)为什么你冻结5分钟? – sharkyenergy

+0

欢迎您,1)获取旧的更新程序,下载新的更新程序,一旦下载了新的更新程序运行新的更新程序,获取新的更新程序以关闭旧的更新程序(如果它正在运行)并删除它,2)如果您仔细看,你会发现程序运行在一个无限循环中,所以5分钟冻结基本上会阻止程序每隔几毫秒检查一次新的更新,你可以删除循环,以便程序只检查一次执行,或者改变程序冻结的时间。 – Sam

1

为什么不只是创建一个ClickOnce部署, ?

0

简单的解决方案,只是 划分的exe文件源代码分成多个DLL文件(如在模块的方面分),并具有主要的exe执行像

子MDImainEXE_load()
DLL.function的dll代码这样
末次

,您可以使用更新的exe 同样的方法与配置和DLL发送新的主EXE,配置文件将包含DLL的名称更新,如果更新EXE必须更新然后命名该DLL作为参数使用,因为更新exe文件不会包含代码只是使用来自DLL文件名称的函数m配置文件参数。

子updateEXE_load()
DLL.function像
末次

如果混淆然后问什么困惑。

+0

老实说,所有困惑我..(漂亮的绿色在这里)应用程序是由一个单一的EXE文件组成..没有更多 – sharkyenergy

+0

你知道Visual Studio有内置的这个功能,对不对? –

+0

什么困惑你,你有多少或计划实施它,以便我们可以得到你的想法实施 – Vin

0

也许像创建转储文件正在运行的进程

你看它here

但是这取决于你的VB版本....

0

老问题,但我做的是,当我为我的主程序中,我复制重命名当前的更新,然后召唤出像重命名的更新所以:

(注意,代码已经简化了解释和说明)

FileCopy("MyUpdater.exe", "~MyUpdater.exe") ' rename the updater 
Shell("~MyUpdater.exe") ' start the updater 
END ' close the current program 

然后当你更新它的工作,它会更新MyUpdater.exe以及对一切否则。