嘗試將先前提過的Word套表服務寫成Windows Service,原本使用Console Application + Self-Hosting ASP.NET Web API測試無誤,移進Windows Service卻壞了。試過將服務執行身分調為本機系統(LocalSystem)或AD網域帳號,錯誤依舊。使用Visual Studio追蹤進程式找到錯誤源頭:
doc = wordApp.Documents.Open(FileName: ref filePath, ReadOnly: ref readOnly);
doc.Activate();
filePath指向的範本docx確定存在,Documents.Open()也未出錯,但執行完doc == null,導致下一列要執行doc.Activate()時爆出NullReferenceException。
同一服務裝在Windows 2003運作順利,在我自己的Windows 2008 R2上也沒問題,問題只發生在另一台Windows 7 32bit開發機器上,一時鬼打牆,瞎抓好一陣子才想到是老問題: c:\windows\syswow64\config\systemprofile\desktop (開始曾一度懷疑,但不知怎麼錯記成它只發生在64bit,連口供都沒問就把人放走... orz)
在32位元Windows 7上開個C:\Windows\System32\config\systemprofile\Desktop資料夾,搞定收工。
補記一點: 掛成Windows Service的程式還能逐行偵錯嗎? Yes, You Can!
執行Windows Service後,用DEBUG/Attach to Process找到該程序掛上去,接下來設中斷點、逐步偵錯的做法就跟直接由VS啟動沒有兩樣囉~ 向地表上最強大的IDE – Visual Studio敬禮!!