Imports System.IO Imports System.Net Imports System.Web Public Class Updater 'Private Shared ReadOnly localPath As String = Application.ExecutablePath Private Shared ReadOnly tempPath As String = Path.Combine(Path.GetTempPath(), "update_temp.exe") Private Shared ReadOnly vbsPath As String = Path.Combine(Path.GetTempPath(), "update_script.vbs") ''' ''' 开始更新任务 ''' ''' 目标地址 ''' 更新文件地址 ''' Public Shared Async Function StartUpdateAsync(localPath As String, updateUrl As String) As Task Try ' 下载更新文件 Using client As New WebClient() Await client.DownloadFileTaskAsync(updateUrl, tempPath) Logger.Info(updateUrl & "文件下载完毕") End Using ' 创建 VBS 脚本 (修正了 VBScript 语法错误) Dim vbsContent As String = $" Set WshShell = CreateObject(""WScript.Shell"") WScript.Sleep 4000 ' 解除保护并替换 EXE On Error Resume Next Set fso = CreateObject(""Scripting.FileSystemObject"") If fso.FileExists(""{Replace(localPath, "\", "\\")}"") Then Set f = fso.GetFile(""{Replace(localPath, "\", "\\")}"") f.Attributes = 0 End If If fso.FileExists(""{Replace(tempPath, "\", "\\")}"") Then fso.CopyFile ""{Replace(tempPath, "\", "\\")}"", ""{Replace(localPath, "\", "\\")}"", True fso.DeleteFile ""{Replace(tempPath, "\", "\\")}"", True End If ' 设置属性 If fso.FileExists(""{Replace(localPath, "\", "\\")}"") Then Set f = fso.GetFile(""{Replace(localPath, "\", "\\")}"") f.Attributes = 4 + 2 + 1 ' System + Hidden + ReadOnly End If ' 启动新程序 WshShell.Run ""{Replace(localPath, "\", "\\")}"", 0, False ' 删除自己 fso.DeleteFile WScript.ScriptFullName, True " File.WriteAllText(vbsPath, vbsContent) Logger.Info("启动脚本:" & vbsContent) ' 启动 VBS 脚本 Dim p As New Process() p.StartInfo.FileName = "wscript" p.StartInfo.Arguments = """" & vbsPath & """" ' 使用引号包裹路径 p.Start() Logger.Info("退出程序") ' 退出当前程序 Environment.Exit(0) Catch ex As Exception Logger.Error("更新失败:" & ex.Message) Throw ' 重要的:重新抛出异常,让调用者知道更新失败 End Try End Function End Class