C#建立Windows服務的幾個注意事項

一、服務安裝後的自動啓動:服務的StartType即便配置成Automatic,在首次安裝成功以後仍是要在服務列表中找到並手工啓動。此外,能夠經過在ProjectInstaller中添加AfterInstall事件,在這個事件中添加批處理啓動此服務。這樣在安裝後就能夠立馬自動啓動了。windows

二、服務的調試:若是服務執行異常,會致使服務啓動失敗,提示相似「…服務啓動後中止。某些服務在未由其餘服務或程序使用時將自動中止」的語句。服務要啓動後才能讓VS在進程中附加,可是有時在服務啓動的時候就出錯,故無法附加進程調試出錯的地方。現考慮一種方法,在服務中添加定時器 System.Timers.Timer,並在服務的啓動方法中,啓用定時器,而後把原先打算寫在OnStart中的處理函數放入Timer的事件中,便可方便調試。函數

3 、在.net中經常使用log4net記錄日誌,一般在WinForm和WebForm中是配置指定log4net使用.config文件來讀取配置信息時使用spa

[assembly: log4net.Config.DOMConfigurator(ConfigFile = "log4net.config", Watch = true)]。可是在windows服務中用這種方式則沒法記錄日誌,由於此時IsDebugEnabled等屬性都爲false,故沒法記錄日誌。究其緣由,是由於在服務裏不能正肯定位到這個配置文件所致。以下代碼中獲取當前 exe 所在目錄並用於獲得config文件的路徑:以下代碼中獲取當前 exe 所在目錄並用於獲得 config 文件的路徑.net

static void Main()
{
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
string configFilePath = assemblyDirPath + "\\log4net.config";
DOMConfigurator.ConfigureAndWatch(new FileInfo(configFilePath));調試

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new HtmlToExcelService()
};
ServiceBase.Run(ServicesToRun);
}日誌

四、 要獲取服務所在的目錄,請使用AppDomain.CurrentDomain.BaseDirectory這個只讀屬性。若是須要生成服務的執行狀況日誌的,建議將日誌文件放在服務所在的目錄下。excel

五、windows服務中用到了 Excel 的 DCOM 組件, 服務的執行帳戶是 system可是在執行中報出了一下錯誤:Exception from HRESULT: 0x800A03EC at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)。緣由:若是服務是system用戶, 系統會去尋找 system這個用戶的Profile目錄, 而這個用戶是不能按照交互用戶登陸的,並且在處理excel文件的過程當中, 一個 for SYSTEM 帳戶 "Desktop" 文件夾是必須的。故要建立一個這樣的目錄。在x64系統中,目錄爲:  C:\Windows\SysWOW64\config\systemprofile\Desktop;在x86系統中,目錄爲: C:\Windows\System32\config\systemprofile\Desktop。orm

相關文章
相關標籤/搜索