Rain 2020-04-16
准备做一个数据查询小工具,由于数据都是固定的,所以其实就是做一个Windows的数据界面展示软件。决定用SQLite和C#搞定,数据库方面比较熟也没遇上什么问题,就略过不表,记几个C#的坑吧
百度搜在C#如何使用SQLite,大多的结果会指向System.Data.SQLite的一个下载站,然而由于.net平台互不兼容所以会列出一大堆文件让你选择下载,不知道怎么回事我下了3.5和4.0的二进制dll文件引入后直接dll报错不能使用,改项目平台也一样没用。最后还是VS2019立功,在显示修补方案有一个“System.Data.SQLite”,然后点安装最新版本就给你适配了合适的版本,这个问题就算解决了。
PS再提一下我个人觉得VS2019的NuGet管理包程序并不那么好用,比如我如果直接搜索“System.Data.SQLite”,它会给我看上去一样但肯定适用平台的几十个不一样结果,对我这种萌新来说体验是很糟糕的,完全不知道这玩意适不适用。
最理想情况下是SQLite直接读取C#资源内的文件,但我没有找到任何API,只能路径去读取数据库文件,那现在的流程就是:打开应用—导出SQLite数据库—连接查询—关闭—删除文件,别问为什么要删除文件,问就是强迫症不允许程序在电脑留下任何纪念品。但万万没想到,无论你什么时候关闭sqlite链接,文件依然是处于被占用的状态,无论你怎么删除就是那么坚挺。万幸我们有谷歌百度,最后找到一个解决方案:在连接Close()后适用GC.Collect();GC.WaitForPendingFinalizers();手动释放内存,之后删除文件就不会提示占用了。
作为一个强迫症患者,我反正不想让一个小应用带上小尾巴,然后生成exe后会依赖两个dll,SQLite.Data.SQLite.dll和SQLite.interop.dll,于是使用ILMerge合并,于是又遇上2个麻烦。ILMerge不支持.net 3.5,我是第一次知道,所以换了4.0然后重新安装System.Data.SQLite,等我重新编译准备合并,然后又提示不能加载文件或程序集“SQLite.Interop.dll”,直接懵圈,ILMerge看上去走不通,只能先把SQLite.Data.SQLite.dll合并掉再取解决SQLite.interop.dll的问题
最后想到一个解决方案,基本和处理SQLite文件一个思路,把SQLite.interop.dll加入项目资源,程序运行时释放到目录下并隐藏,程序关掉时再删除dll
但是dll一旦加载就不像sqlite释放资源就行,所以这里的处理思路是新起一个cmd进程,在延时一段时间(等待程序关闭)后执行删除dll命令,具体命令参照
ping 1.1.1.1 -n 1 -w 1000 > Nul & Del DLLPATH
延时是通过ping来实现的,还有一个小细节,Del命令不能直接删除隐藏文件,所以删除前还要把dll设置为非隐藏
虽然工具的思路和代码都很简单,但一波三折愣是花了一下午,谨以此碎碎念铭记我逝去的青春