准備做一個數據查詢小工具,由於數據都是固定的,所以其實就是做一個Windows的數據界面展示軟件。決定用SQLite和C#搞定,數據庫方面比較熟也沒遇上什么問題,就略過不表,記幾個C#的坑吧
1. SQLite加載庫
百度搜在C#如何使用SQLite,大多的結果會指向System.Data.SQLite的一個下載站,然而由於.net平台互不兼容所以會列出一大堆文件讓你選擇下載,不知道怎么回事我下了3.5和4.0的二進制dll文件引入后直接dll報錯不能使用,改項目平台也一樣沒用。最后還是VS2019立功,在顯示修補方案有一個“System.Data.SQLite”,然后點安裝最新版本就給你適配了合適的版本,這個問題就算解決了。
PS再提一下我個人覺得VS2019的NuGet管理包程序並不那么好用,比如我如果直接搜索“System.Data.SQLite”,它會給我看上去一樣但肯定適用平台的幾十個不一樣結果,對我這種萌新來說體驗是很糟糕的,完全不知道這玩意適不適用。
2. SQLite數據文件刪除
最理想情況下是SQLite直接讀取C#資源內的文件,但我沒有找到任何API,只能路徑去讀取數據庫文件,那現在的流程就是:打開應用—導出SQLite數據庫—連接查詢—關閉—刪除文件,別問為什么要刪除文件,問就是強迫症不允許程序在電腦留下任何紀念品。但萬萬沒想到,無論你什么時候關閉sqlite鏈接,文件依然是處於被占用的狀態,無論你怎么刪除就是那么堅挺。萬幸我們有谷歌百度,最后找到一個解決方案:在連接Close()后適用GC.Collect();GC.WaitForPendingFinalizers();手動釋放內存,之后刪除文件就不會提示占用了。
3. ILMerge合並文件
作為一個強迫症患者,我反正不想讓一個小應用帶上小尾巴,然后生成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設置為非隱藏
雖然工具的思路和代碼都很簡單,但一波三折愣是花了一下午,謹以此碎碎念銘記我逝去的青春