記錄一個可能比較少碰到的問題:ScintillaNET 載入失敗,錯誤訊息是「找不到指定的模組」。
我把某專案更新至 .NET 6 之後,嘗試把新版應用程式部署至 Windows 11 的 Sandbox,結果程式一執行就出現錯誤訊息:「找不到指定的模組。」如下圖:
這個錯誤訊息沒有提供足夠資訊,無從判斷是哪一個 DLL 檔案找不到。當下只能確定,是在應用程式的主視窗載入時便發生這個錯誤,而且我也確定 .NET 6 runtime 已經有事先安裝好,應用程式的相依套件也有部署。
後來,我寫了一個簡單的 Windows Forms 程式來測試,在主視窗上面放一個按鈕,而且當按鈕按下時,才建立 Scintilla 控制項:
private void button1_Click(object sender, EventArgs e) { scintilla = new Scintilla(); Controls.Add(scintilla); }
將此程式部署到 Windows 11 Sandbox 環境上執行,點擊按鈕之後,同樣也是出現錯誤訊息,但這次有明確指出是哪個 DLL 無法載入:SciLexer.dll。如下圖:
從錯誤訊息可知,Scintella 控制項會嘗試到當前使用者個人帳戶的 AppData\Local\Temp\ScintillaNET\.... 子目錄載入 SciLexer.dll。
有了上述線索之後,嘗試用一些關鍵字搜尋,找到了原作者 GitHub 專案的第 407 號問題單,有人碰到相同的狀況。該問題單下方有作者回覆,指向一個解決方法:Using a Custom SciLexer.dll。然而,使用那個方法也無法解決我碰到的問題。
至此案情大致調查完畢,可以確定我碰到的狀況是因為在 Windows 11 沙箱環境中執行應用程式時,因某種不明原因,使得 Scintella 無法順利讀取使用者個人帳戶的暫存資料夾底下的 SciLexer.dll。我在測試應用程式時到那個資料夾查看,確認有自動產生 SciLexer.dll(內嵌於 Scintella.DLL),但卻因為某種不明原因而無法讀取檔案。
我在其他 Windows 環境上測試都沒有這個問題,而只有 Windows 11 沙箱環境才會出現。也許這個問題並不會在一般 Windows 環境出現,故先記錄下來,若將來發現其他線索,再回來更新。
備註:本文已同布發表於我的 GitHub Wiki。
沒有留言: