IoTClientTool自动升级更新

IoTClientTool是什么

IoTClientTool是什么,IoTClientToolIoTClient开源组件的可视化操的做实现。方便对plc设备和ModBusRtu、BACnet、串口等协议进行测试和调试。git

打包成单文件exe

一般咱们开发出来的WinForm程序,除了一个exe文件还会有不少dll文件。
那么有没有办法只生成一个exe文件,让程序更加方便传播和使用,答案是确定的。
NuGet搜索Costura.Fody并下载,而后从新生成解决方案便可,你在去bin目录查看,原来的一堆dll不见了。
github

.net core官方支持打包成单文件

若是你使用的.net core 3.0,那么你能够直接使用官方支持的发布单文件功能。
直接使用命令dotnet publish -r win10-x64 /p:PublishSingleFile=true
或者修改一下项目文件json

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>//发布平台
    <PublishSingleFile>true</PublishSingleFile>//是否单个exe
  </PropertyGroup>
  <PropertyGroup>
    <PublishTrimmed>true</PublishTrimmed>//启用压缩
  </PropertyGroup>
</Project>

自动升级更新

一个有生命的桌面程序理应作到能够自动升级。不少人在作自动升级更新时会执行一个单独的升级exe,也就是说一个完整的程序起码包括两个exe。我的以为不够优雅,若是能用一个exe本身更新本身岂不是完美。思考以下:
api

本身更新本身 ,而后杀了本身,启动新的本身。
代码可参考https://github.com/zhaopeiym/IoTClient/blob/master/IoTClient.Tool/IndexForm.cs中的CheckUpgradeAsync方法。app

/// <summary>
/// 检查当前是否须要升级
/// </summary>
private async Task CheckUpgradeAsync()
{
    UpgradeFileManage();
    HttpClient http = new HttpClient();
    var content = new StringContent(JsonConvert.SerializeObject(new VersionCheckInput()));
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    var response = await http.PostAsync("https://download.haojima.net/api/IoTClient/VersionCheck", content);
    var result = await response.Content.ReadAsStringAsync();
    var VersionObj = JsonConvert.DeserializeObject<ResultBase<VersionCheckOutput>>(result);
    if (VersionObj.Code == 200 && VersionObj.Data.Code == 1)
    {
        if (MessageBox.Show("IoTClient有新版本,是否升级到最新版本?", "版本升级", MessageBoxButtons.OKCancel) == DialogResult.OK)
        {
            if (new UpgradeForm().ShowDialog() != DialogResult.OK) return;
            var newApp = Application.StartupPath + @"\temp." + Path.GetFileName(Application.ExecutablePath);
            //打开临时文件 关闭并旧版本
            Process.Start(newApp);
            Close();
            Environment.Exit(0);
        }
    }
}

/// <summary>
/// 升级文件处理
/// </summary>
private void UpgradeFileManage()
{
    //若是启动的升级临时文件,
    //则一、删除旧版本 二、复制当前临时文件为新版本 三、启动新版本 四、关闭当前打开的临时版本
    if (Path.GetFileName(Application.ExecutablePath).Contains("temp."))
    {
        var filePath = Path.Combine(Application.StartupPath, Path.GetFileName(Application.ExecutablePath).Replace("temp.", ""));
        var newFilePath = filePath;
        try
        {
            try
            {
                //2.1删除旧版本
                if (File.Exists(filePath)) File.Delete(filePath);
            }
            catch (Exception)
            {
                //若是由于进程正在使用中则休眠后再重试
                //出现此问题的缘由是,上一个程序还没关闭,这个程序就启动了,启动后会执行删除上一个程序,因此报错。
                Thread.Sleep(500);
                if (File.Exists(filePath)) File.Delete(filePath);
            }
            //三、复制临时文件为新的文件 打开新的文件       
            File.Copy(Application.ExecutablePath, newFilePath);
            //三、打开新的文件
            Process.Start(filePath);
            //四、关闭临时文件   
            //Close();
            Environment.Exit(0);
        }
        catch (Exception ex)
        {
            MessageBox.Show("升级失败 " + ex.Message);
        }
    }
    //4.2若是当前启动的不是临时文件,则删除临时文件。
    else
    {
        var filePath = Path.Combine(Application.StartupPath, "temp." + Path.GetFileName(Application.ExecutablePath));
        try
        {
            if (File.Exists(filePath)) File.Delete(filePath);
        }
        catch (Exception)
        {
            Thread.Sleep(500);
            if (File.Exists(filePath)) File.Delete(filePath);
        }
    }
}

效果图

相关文章
相关标签/搜索