1. 程式人生 > >【專案經驗】安裝服務時的總結

【專案經驗】安裝服務時的總結

總結一

1、服務安裝軟體編寫時漏了呼叫一個函式,UpdateListView(),導致啟動服務,一直不重新整理狀態,除錯時一直抓著sc.start()不放,一直以為是這個問題。 報錯: {System.InvalidOperationException: 無法開啟計算機“.”上的 OnlineService 服務。 ---> System.ComponentModel.Win32Exception: 拒絕訪問。 --- 內部異常堆疊跟蹤的結尾 --- 在 System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) 在 System.ServiceProcess.ServiceController.Start(String[] args) 在 ServerManager.ServiceAPI.RunService(String NameService) 位置 g:\大通\大通伺服器\ServerManager\ServiceAPI.cs:行號 88}

解決:使用管理員除錯就好了。使用管理員開啟VS,除錯程式碼,執行正常。

總結二

將服務應用程式改為服務時 步驟1:新建兩個元件Windows服務 這裡寫圖片描述 分別命名為OnlineService和OnlineServiceInstaller.cs 引用新增System.Configuration.Install和System.ServiceProcess

OnlineService繼承ServiceBase,重寫OnStart( )和重寫OnStop( );

        protected override void OnStart(string[] args)
        {
            m_server = new AsyncServer();
m_logger = new FileLogger(); m_server.SetLogger(m_logger); m_logger.InitLogAPI(GlobalData.GetAppPath(), "OnlineServer.log"); ServerConfig config = new ServerConfig(); if (!config.ReadFile(GlobalData.GetAppPath() + "\\ServerConfig.xml")) { m_logger.Log
("無法讀取配置檔案!"); return; } if (config.DBServerInfo == null) { m_logger.Log("無法從配置檔案中讀取資料庫配置!"); return; } if (config.TCPServerInfo == null) { m_logger.Log("無法從配置檔案中讀取伺服器配置!"); return; } DBGlobal.SetDBServer(config.DBServerInfo.Server, config.DBServerInfo.DBName, config.DBServerInfo.User, config.DBServerInfo.Password); m_server.Start(config.TCPServerInfo.IP, config.TCPServerInfo.Port); } protected override void OnStop() { if (m_server.Runing) { m_server.Stop(); } }

OnlineService.Designer.cs不作修改 OnlineServiceInstaller.cs元件上新增兩個控制元件 第一個是serviceInstaller1、第二個是serviceProcessInstaller1 這裡寫圖片描述 這裡寫圖片描述 OnlineServiceInstaller.Designer.cs中改寫

this.serviceInstaller1.Description = "MDIA Online Server";
this.serviceInstaller1.DisplayName = "OnlineService";
this.serviceInstaller1.ServiceName = "OnlineService";

OnlineServiceInstaller.cs

    [RunInstaller(true)]
    public partial class OnlineServiceInstaller : Installer
    {
        public OnlineServiceInstaller()
        {
            InitializeComponent();
        }
    }
    //public不要忘了,會出現解除安裝不成功或者安裝不成功
    static class Program
    {
        /// <summary>
        /// 應用程式的主入口點。
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;

            // 同一程序中可以執行多個使用者服務。若要將
            // 另一個服務新增到此程序中,請更改下行以
            // 建立另一個服務物件。例如,
            //
            //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
            //
            ServicesToRun = new ServiceBase[] { new OnlineService() };

            ServiceBase.Run(ServicesToRun);
        }
    }

總結三

服務獲取AppPath時的不能再使用Windows.Form. System.Windows.Forms.Application.StartupPath

        static public string GetWindowsServiceInstallPath(string ServiceName)
        {
            string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
            string path = Registry.LocalMachine.OpenSubKey(key).GetValue("ImagePath").ToString();
            //替換掉雙引號   
            path = path.Replace("\"", string.Empty);

            FileInfo fi = new FileInfo(path);
            return fi.Directory.ToString();
        }

        static public string GetAppPath()
        {
            string strPath = GetWindowsServiceInstallPath("OnlineService");
            return strPath;
        }

總結四

Access資料庫連線報錯,未在本機註冊Micsoft.Access 驅動 解決辦法:安裝一個驅動Access驅動安裝包(64位的)

ODBC驅動方式: Driver={Microsoft Access Driver (*.mdb)};Dbq=c:somepathdbname.mdb;Uid=Admin;Pwd=pass; 微軟的odbc驅動存在一些不穩定的bug,有可能導致此類錯誤。應該將其修改為oledb的access驅動方式。微軟本身已經放棄了對odbc資料來源連線方式的支援,並建議使用者使用oledb方式

OLEDB驅動方式: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:somepathdbname.mdb;User Id=admin;Password=pass; 32位系統 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:somepathdbname.mdb 64位系統

Access的SQL語句和SQLServer不一樣 accesss要用的是”#” +time.Text+ “#”,SQL是可以直接用單引號。 Access中* 為匹配多個字串,但是在C#編寫Access的模糊查詢中必須用 %才能查詢匹配%,但是,在Access中的SQL查詢中只能使用 *匹配查詢!