【问题标题】:VB.Net Program should auto updateVB.Net 程序应该自动更新
【发布时间】:2024-04-23 08:50:02
【问题描述】:

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

【问题讨论】:

    标签: vb.net auto-update


    【解决方案1】:

    只需关闭旧程序。

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

    更新程序,

     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
    

    【讨论】:

    • 谢谢!只有 2 个小问题:我如何更新更新程序? :) 你为什么要冻结 5 分钟?
    • 欢迎您,1) 获取旧更新程序以下载新更新程序,下载新更新程序后运行新更新程序,获取新更新程序以关闭旧更新程序(如果它正在运行)并删除它,2)如果你仔细看你会发现程序在无限循环中运行,所以 5 分钟的冻结基本上会阻止程序每隔几毫秒检查一次新的更新,你可以删除循环,以便程序仅在执行后检查,或更改程序冻结的时间。
    【解决方案2】:

    老问题,但我所做的是,当我在我的主程序中时,我复制重命名当前更新程序,然后像这样调用重命名的更新程序:

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

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

    然后,当您的更新程序完成工作时,它将更新 MyUpdater.exe 以及其他所有内容。

    【讨论】:

      【解决方案3】:

      为什么不直接创建一个 ClickOnce 部署并将其托管在某个地方?

      【讨论】:

        【解决方案4】:

        简单的解决方案, 只需将 exe 文件源代码分成多个 DLL 文件(如按模块划分)并让主 exe 执行 dll 代码,如

        sub MDImainEXE_load()
        DLL.function 那样
        结束子

        您可以使用相同的方法更新 exe 发送带有配置和 DLL 的新主 exe,配置文件将包含要更新的 DLL 名称,如果更新 exe 必须更新,则将该 DLL 命名为要使用的参数,因为更新 exe 不会包含代码,只需使用配置文件参数中的 DLL 文件名中的函数.

        子更新EXE_load()
        DLL.function 那样
        结束子

        如果困惑,那么问什么困惑。

        【讨论】:

        • 老实说,都把我弄糊涂了..(这里很绿)应用程序是由单个 exe 文件组成的..仅此而已
        • 你知道 Visual Studio 内置了这个功能吧?
        • 什么让您感到困惑,您获得了多少或计划实施它,以便我们了解您的实施想法
        • @Just me link
        • @Douglas,是的,我知道,但我不喜欢它。它比它的价值带来了更多的麻烦.. vinod 可能是您解释的方式.. 无法跟随您并理解您的意思。谢谢! ps:现在看链接
        【解决方案5】:

        可能类似于为正在运行的进程创建转储文件

        你看here

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

        【讨论】: