iotclienttool是什么,iotclienttool是iotclient开源组件的可视化操的作实现。方便对plc设备和modbusrtu、bacnet、串口等协议进行测试和调试。
通常我们开发出来的winform程序,除了一个exe文件还会有很多dll文件。
那么有没有办法只生成一个exe文件,让程序更加方便传播和使用,答案是肯定的。
nuget搜索costura.fody
并下载,然后重新生成解决方案即可,你在去bin目录查看,原来的一堆dll不见了。
如果你使用的.net core 3.0,那么你可以直接使用官方支持的发布单文件功能。
直接使用命令dotnet publish -r win10-x64 /p:publishsinglefile=true
或者修改一下项目文件
<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自己更新自己岂不是完美。思考如下:
自己更新自己 ,然后杀了自己,启动新的自己。
代码可参考https://github.com/zhaopeiym/iotclient/blob/master/iotclient.tool/indexform.cs中的checkupgradeasync方法。
/// <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() { //如果启动的升级临时文件, //则1、删除旧版本 2、复制当前临时文件为新版本 3、启动新版本 4、关闭当前打开的临时版本 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); } //3、复制临时文件为新的文件 打开新的文件 file.copy(application.executablepath, newfilepath); //3、打开新的文件 process.start(filepath); //4、关闭临时文件 //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); } } }
如对本文有疑问, 点击进行留言回复!!
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
网友评论