WindowsService調用API


本文着重於WindowsServic如何調用API以及出現部分問題的解決方案

本文Windows Service 創建摘自JasperXu的博客   鏈接:http://www.cnblogs.com/sorex/archive/2012/05/16/2502001.html

 

C#創建Windows Service(Windows 服務)基礎教程

 

Windows Service這一塊並不復雜,但是注意事項太多了,網上資料也很凌亂,偶爾自己寫也會丟三落四的。所以本文也就產生了,本文不會寫復雜的東西,完全以基礎應用的需求來寫,所以不會對Windows Service寫很深入。

本文介紹了如何用C#創建、安裝、啟動、監控、卸載簡單的Windows Service 的內容步驟和注意事項。

一、創建一個Windows Service

1)創建Windows Service項目

imageimage

2)對Service重命名

將Service1重命名為你服務名稱,這里我們命名為ServiceTest。

二、創建服務安裝程序

1)添加安裝程序

image

image

之后我們可以看到上圖,自動為我們創建了ProjectInstaller.cs以及2個安裝的組件。

2)修改安裝服務名

右鍵serviceInsraller1,選擇屬性,將ServiceName的值改為ServiceTest。

image

3)修改安裝權限

右鍵serviceProcessInsraller1,選擇屬性,將Account的值改為LocalSystem。

image

三、寫入服務代碼

1)打開ServiceTest代碼

右鍵ServiceTest,選擇查看代碼。

2)寫入Service邏輯

添加如下代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WindowsServiceTest {  public partial class ServiceTest : ServiceBase  {        

//計時器必須要是全局      

  System.Timers.Timer timer1;   public ServiceTest()   {    InitializeComponent();   }

        /// <summary>

        ///服務開始  

       ///此處需要根據實際情況來決定,如果想讓服務調用接口(使用System.Timers.Timer計時器)       

     /// </summary>        

   /// <param name="args"></param>

  protected override void OnStart(string[] args)   {        

 

          timer1 = new System.Timers.Timer();

          timer1.Interval = 1200000;  //設置計時器事件間隔執行時間20分鍾執行一次          

            timer1.Elapsed += new System.Timers.ElapsedEventHandler(StartIntegrate);

            timer1.Enabled = true;   

  }        

/// <summary>        

/// 服務結束        

/// </summary>   

protected override void OnStop()   {                

            }

 

        /// <summary>  

       /// 這里是要寫入調用接口的方法了

        /// </summary>        

/// <param name="sender"></param>        

/// <param name="e"></param>        

public static void StartIntegrateTest(object sender, System.Timers.ElapsedEventArgs e) {

            int  hour = DateTime.Now.Hour;//當前時間  小時

            int  minu = DateTime.Now.Minute;//當前時間 分                      

//判斷時間是否為0點整  

           if (hour == 2 && minu <= 59)   

          {                

        string ContractorCode = "10010021";

                string year = DateTime.Now.Year.ToString();                          

      string edate = DateTime.Now.ToString("yyyy-MM-dd");//結束時間為當前時間

                string sdate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");//開始當前時間-24H

                //以下方法為接口的方法

                DAL.Integrate.IntegrateContractorInfo(ContractorCode); 

                DAL.Integrate.IntegrateContractorTrainInfoByTime(ContractorCode, sdate, edate);//

                DAL.Integrate.IntegrateContractorQualifiedInfo(ContractorCode, year);  

                DAL.Integrate.IntegrateEnterpriseTrainRecord(ContractorCode, year);

                DAL.Integrate.IntegrateEnterpriseTrainRecordUser(ContractorCode, sdate, edate);

                DAL.Integrate.IntegrateEnterpriseTrainCertificate(ContractorCode, sdate, edate);                       }

        }

 

    } }

四、創建安裝腳本

在項目中添加2個文件如下(必須是ANSI或者UTF-8無BOM格式):

1)安裝腳本Install.bat

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
Net Start ServiceTest
sc config ServiceTest start= auto
::pause
2)卸載腳本Uninstall.bat
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe
::pause
3)安裝腳本說明

第二行為啟動服務。

第三行為設置服務為自動運行。

這2行視服務形式自行選擇。

4)腳本調試

如果需要查看腳本運行狀況,在腳本最后一行加入pause

五、在C#中對服務進行控制

0)配置目錄結構

簡歷一個新WPF項目,叫WindowsServiceTestUI,添加對System.ServiceProcess的引用。

在WindowsServiceTestUI的bin\Debug目錄下建立Service目錄。

將WindowsServiceTest的生成目錄設置為上面創建的Service目錄。

生成后目錄結構如下圖

image

 

1)安裝

安裝時會產生目錄問題,所以安裝代碼如下:

        /// <summary>
        /// 安裝
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
  private void btnInstall_Click(object sender, RoutedEventArgs e)
  {
   string CurrentDirectory = System.Environment.CurrentDirectory;
   System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
   Process process = new Process();
   process.StartInfo.UseShellExecute = false;
   process.StartInfo.FileName = "Install.bat";
   process.StartInfo.CreateNoWindow = true;
   process.Start();
   lblLog.Text = "安裝成功";
   System.Environment.CurrentDirectory = CurrentDirectory;
  }

2)卸載

卸載時也會產生目錄問題,所以卸載代碼如下:

     /// <summary>
        /// 卸載
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
  private void btnUninstall_Click(object sender, RoutedEventArgs e)
  {
   string CurrentDirectory = System.Environment.CurrentDirectory;
   System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
   Process process = new Process();
   process.StartInfo.UseShellExecute = false;
   process.StartInfo.FileName = "Uninstall.bat";
   process.StartInfo.CreateNoWindow = true;
   process.Start();
   lblLog.Text = "卸載成功";
   System.Environment.CurrentDirectory = CurrentDirectory;
  }
 
3)啟動

代碼如下:

  /// <summary>
        /// 啟動服務
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
  private void btnStart_Click(object sender, RoutedEventArgs e)
  {
   ServiceController serviceController = new ServiceController("ServiceTest");
   serviceController.Start();
   lblStatus.Text = "服務已啟動";
  }
4)停止
    /// <summary>
        /// 停止服務
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
  private void btnStop_Click(object sender, RoutedEventArgs e)
  {
   ServiceController serviceController = new ServiceController("ServiceTest");
   if (serviceController.CanStop)
   {
    serviceController.Stop();
    lblStatus.Text = "服務已停止";
   }
   else
    lblStatus.Text = "服務不能停止";
  }

5)暫停/繼續

    /// <summary>
        /// 暫停/繼續服務
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
  private void btnPauseContinue_Click(object sender, RoutedEventArgs e)
  {
   ServiceController serviceController = new ServiceController("ServiceTest");
   if (serviceController.CanPauseAndContinue)
   {
    if (serviceController.Status == ServiceControllerStatus.Running)
    {
     serviceController.Pause();
     lblStatus.Text = "服務已暫停";
    }
    else if (serviceController.Status == ServiceControllerStatus.Paused)
    {
     serviceController.Continue();
     lblStatus.Text = "服務已繼續";
    }
    else
    {
     lblStatus.Text = "服務未處於暫停和啟動狀態";
    }
   }
   else
    lblStatus.Text = "服務不能暫停";
  }

6)檢查狀態

       /// <summary>
        /// 服務狀態監測
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
  private void btnCheckStatus_Click(object sender, RoutedEventArgs e)
  {
   ServiceController serviceController = new ServiceController("ServiceTest");
   lblCheckStatus.Text = serviceController.Status.ToString();
  }

六、需要在ServiceTest的APP.Config下配置如下信息

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
    <add name="" connectionString="" providerName="System.Data.EntityClient" />//寫入地址等相關信息
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v12.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

七、總結

在發布編譯文件,並運行時,有時候會出現Stopping導致服務一直無法關閉,運行會直接報錯,此時需要你在進程中關掉服務之后,以管理員身份運行該運用程序

 

示例代碼請見:https://github.com/sorex/WindowsServiceTest


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM