.net中的windows service与调服务操作

昨天一个朋友想用做个短信网关,与移动TCP/IP通迅来完成短信的发送。并且想是用一个Windows服务来完成这个工作,但是又想让管理员能在客户端(浏览器端)对服务进行装载,卸载,启动,停止。我初步听了以后,觉得这个需求是可以完成的,服务这个项目的建立没有问题,控制服务这个项目也是没有问题的。于是就研究了一下,并去网上搜集了一些资料,整理了一个从技术角度相对完整的文档,拿出来给大家分享一下。

为了简化业务,这里就把与短信网关通信的需求改成每间隔一秒钟向一个txt文档写一个当前时间的需求。

我们先来看服务部分:

打开VS2008,“文件→新建→项目”,选择“Windows”项中的“Windows服务”,根据自己的情况修跑径和名称,这里的名称修为“WriteTextService”,确定后,出现一个“若要在类中添加组件,请从工具箱中拖出它们,然后例用”属性”窗口来设置它们的属性。若要为类创建方法和事件,请单击此处切换到代码视图。”的一个界面,我们如果处理业务逻辑,单击“单击此处切换到代码视图”,来转换到代码页。

代码

WriteTextService.cs

 

 

 1using System;ITPUB个人空间%A3|d6u1n|,K!Z?
 2using System.ServiceProcess;
Zln#H]4V)tb;G0 3using System.IO;
gi s&TbM^]0 4using System.Threading;
C.Th)C)JiNYQ0 5ITPUB个人空间K;T4[1J3`L
 6namespace WriteTextServiceNSITPUB个人空间7@}6A4z3d
 7{
%^8FN)nu0 8    public partial class WriteTextService : ServiceBaseITPUB个人空间 k&DL%z[ Yt
 9    {
_4j{V`p&C(g010        public WriteTextService()
w/VEY:v K011        {
N#m,Ga+K-?k012            InitializeComponent();ITPUB个人空间ag+Sle.d
13        }ITPUB个人空间'Su$hO5I.LavT
14        protected override void OnStart(string[] args)
k fG0Jj015        {
2f:W__!a;c^[016            Thread t = new Thread(new ThreadStart(DY));
%i"KrZ s8FYi017            t.Start();                    
|H(/v U"NbEF&@7`018        }ITPUB个人空间%Oo#v} i0uls"L/y"}@
19        private void DY()
RqvvlGA020        {
3g{{S)h5I}*t:c!V021            while (true)ITPUB个人空间+S.U6dUHfm
22            {
,Z P1P3Y9Z4Q$cwb!z7f023                File.WriteAllText(@"F:/gsw.txt",DateTime.Now.ToString());ITPUB个人空间5kac4rRCpPWK
24                Thread.Sleep(2000);
3k,_|LE7l!q{025            }
I:uK%z;nt$C:fr'|026        }ITPUB个人空间DA G/@W%|b
27        protected override void OnStop()ITPUB个人空间2v?:|S'{0^ AN
28        {
6N[6L+C$_]S-|1dr029        }ITPUB个人空间IZ6}5]`L
30    }ITPUB个人空间5QA7tw7k F |n
31}
|*K2^3kf&[3|4k&I&p032ITPUB个人空间an*B s//E
现在,我们还需要在服务中创建一个服务安装类,来完成服务初始化安装工作。

我们创建一个类ServiceInstall

ServiceInstall.cs

 

 

 1using System.Collections;
p|]G7yWw2o0 2using System.Configuration.Install;ITPUB个人空间*Q+n0_5y*Ua'U;^.Y
 3using System.ServiceProcess;ITPUB个人空间Y/` o Kh)gt |
 4using System.ComponentModel;ITPUB个人空间ps:]yq
 5using Microsoft.Win32;
8`vk[)y:]0 6
3a2T5/8VVxhP0 7namespace WriteTextServiceNSITPUB个人空间#i5|p |1]m#| M`0~
 8{
E&X-Z~8@Xa EE0 9    [RunInstaller(true)]
G:{1Qo*I*@FZ010    public class ServiceInstall : InstallerITPUB个人空间4k)t /I8v8^
11    {ITPUB个人空间9edqsORz
12        private ServiceInstaller WTSerInst;  //它由安装实用工具用来将与服务关联的注册表值写入 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services 注册表项内的子项。
8ZJz| u J5P013        private ServiceProcessInstaller  WTProInst;  //安装实用工具使用它来写与要安装服务关联的注册表值。ITPUB个人空间!tYr}8^f$?#p
14        public ServiceInstall()
ca3s y,l xR{ l015        {
2Fj(Zc"l016            WTProInst = new ServiceProcessInstaller();
*KF{'U)@8pa017            WTProInst.Account = ServiceAccount.LocalSystem;  //安装服务时使用的账户
'L&V&nm_ ]+cA018         
bn%G z @019            WTSerInst = new ServiceInstaller();           ITPUB个人空间)`9} ?[/O QB0N
20            WTSerInst.StartType = ServiceStartMode.Automatic ; //启动服务的后模式(Automatic 自动,Manual 手动,Disabled 禁用)ITPUB个人空间+L[QX-[C
21            WTSerInst.ServiceName = "WriteTextService";   //要安装服务的名称 与服务类名相同ITPUB个人空间6PLv$m$a+W u]
22          
r:F2uSe.hY,B%n a023            Installers.Add(WTSerInst);  //把服务安装类放入安装集合中ITPUB个人空间/B.fQ*{o#}(fsU I
24            Installers.Add(WTProInst);ITPUB个人空间jM_8d#z JN fD;gr
25        }ITPUB个人空间Q1bp Q)C4Da})m
26        /** <summary>ITPUB个人空间xmv[ z
27        /// 重写父类的安装,并在安装服务后写入服务的描述
J.J&_0ET`-J:IIS028        /// </summary>ITPUB个人空间RAI3`T
29        /// <param name="stateSaver"></param>
y-]w},b)l[,Lj030        public override void Install(IDictionary stateSaver)ITPUB个人空间t/9|!PnyD.G ~P
31        {
O{Ib H)h$O032            RegistryKey system,service,config;
@q0T$c L&O033            try
J a7{O7B2nWifH_034            {
Apow%H~`035                base.Install(stateSaver);
nt$N nf)|036                system = Registry.LocalMachine.OpenSubKey("System").OpenSubKey("CurrentControlSet").OpenSubKey("Services");
^L`"?@M1a J037                service = system.OpenSubKey(this.WTSerInst.ServiceName, true);
:q S6W:N0bf038                service.SetValue("Description", "……这是一个每秒写入Text一次时间的服务……");            
jRS/+MMq1R$U1Bj039                config = service.CreateSubKey("AdditionalInformation");
8ZX2o M.}"k|_6@%CF040            }
oC"i/p(J b.fk-L7y5A041            catchITPUB个人空间&pS/C[c~
42            { }
N*Q'F%E~Y P L043        }ITPUB个人空间)E:BOd8m Cu0RN
44        /** <summary>ITPUB个人空间gn loA
45        /// 重写父类的卸载,并在卸载服务后删除描述
"T7{;^PHO046        /// </summary>ITPUB个人空间_7w ^G'd0z
47        /// <param name="stateServer"></param>ITPUB个人空间-ny-j`,A1O V
48        public override void Uninstall(IDictionary stateServer)
g k#?]M049        {ITPUB个人空间-A8Fvyb8X
50            RegistryKey system,currentControlSet,services,service;
go0}Ih(O:V051            try
&[:E(|"Y%tPl ` }052            {
e }D'U wX053                system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");ITPUB个人空间 }e8{$LaL l&U
54                currentControlSet = system.OpenSubKey("CurrentControlSet");
*T8h+?/L FJ L9~055                services = currentControlSet.OpenSubKey("Services");
@5d^ [}M%W056                service = services.OpenSubKey(this.WTSerInst.ServiceName, true);ITPUB个人空间+]8f e)euuYGX
57                service.DeleteSubKeyTree("AdditionalInformation");ITPUB个人空间3Q |1[[1r;Q
58            }ITPUB个人空间/ B W:j`j
59            catchITPUB个人空间.fa4}"/0~]p?:n
60            {}
0|e2bA7v061            finally
+SD/t CztG062            {
/bp1PATp3NW*d[063                base.Uninstall(stateServer);ITPUB个人空间 |D"_;A#s*aMRy3]
64            }ITPUB个人空间7](_lpz8w
65        }ITPUB个人空间2O.I O~)|
66    }
-gW#xH+W067}ITPUB个人空间&lpD'uU.e_5a
68ITPUB个人空间~p-g-O.o8d8{6|/u)@
 

 

这样就完成了一个服务,关且有服务的描述,最要是通过重写父类Install和Uninstall来完成对服务描述的添加。因为服务都是在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/WriteTextService下有个项Description,给这个项添加数据就对应该服务的描述,所以Install和Uninstall两个方法本质上就是注册表英的添加与删除。

 

接下来我们看一下服务的操作,即装载,卸载,启动,停止。

我们新建一个web网站,只有一个Default.aspx页面,代码如下:

Default.aspx

 

 

 1<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
w(n~2J%Y{)J1~0 2ITPUB个人空间7] |YmQ1/M qO7j
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7@/~(kh-H,@)KU0 4ITPUB个人空间9i8Ty,nYYw8z
 5<html xmlns="http://www.w3.org/1999/xhtml">
-zA7mtz;l2A ZI0 6<head runat="server">
?e(C];h+[rP#Y+pF&IO0 7    <title>无标题页</title>
g0|D,|b9cd!j0 8</head>
h*FTZmAI`0 9<body>ITPUB个人空间v+l}1uzj/];H
10    <form. id="form1" runat="server">ITPUB个人空间S!v IfiqN
11    <div>ITPUB个人空间Az/@!^DXa'B:D
12   ITPUB个人空间)owC X,d4j V
13        <asp:Button ID="Button1" runat="server" nclick="Button1_Click" Text="装载服务" />ITPUB个人空间*I7A!Qq2R.@Ea7Z2~
14        <asp:Button ID="Button2" runat="server" nclick="Button2_Click" Text="卸载服务" />
T/ c8u&kke3K015        <asp:Button ID="Button3" runat="server" nclick="Button3_Click" Text="启动服务" />
/ac&~*YN,V1Uw$~4]016        <asp:Button ID="Button4" runat="server" nclick="Button4_Click" Text="停止服务" />ITPUB个人空间$r)YE(wy/U6l,^F/F@-t
17   ITPUB个人空间3?fH.{Gn"C|EB
18    </div>ITPUB个人空间%a4eOB$c;`
19    </form>ITPUB个人空间B6PwDKm
20</body>
SB F&^,xiTa021</html>ITPUB个人空间/l B s:F b;I
22
&DcqK'i0 

Default.aspx.cs

 

 1using System;
t*q?f`.['Lm k0 2using System.Configuration;ITPUB个人空间U[2c P `;qbQ
 3using System.Web;
.h~9qAax3u)Dz0 4using System.Web.Security;
"U7Y0|*f+g0 5using System.Web.UI;
[2u6[EW0 6using System.Web.UI.HtmlControls;ITPUB个人空间 `1@2jd'K+c M m
 7using System.Web.UI.WebControls;
6T$?B+u!H0 8using System.Web.UI.WebControls.WebParts;
i/J_8}On8d!]r0 9using System.Xml.Linq;ITPUB个人空间6i"d)eL,LO i:J
10using System.Configuration.Install;
7V3v:j&@ce$F011using System.Collections;
r/ye XU9hv012using System.ServiceProcess;
c'T&c Z_s;t013ITPUB个人空间N~Ys]$tjw/_u
14
f3fI oz$|w t015public partial class _Default : System.Web.UI.PageITPUB个人空间!rP7])W/'CW7q
16{
a,?0r&q&jh4] l/ty017    protected void Page_Load(object sender, EventArgs e)
_Nr+/oC(kh018    {ITPUB个人空间[9Z-S"S%w#Tz
19
FY CF[*?020    }
WEb7F eI%S.hSc021    protected void Button1_Click(object sender, EventArgs e)ITPUB个人空间FJc+X!e V
22    {ITPUB个人空间8r3mfn1JL'Zfq~z
23        AssemblyInstaller myassemblyinstaller = new AssemblyInstaller();//加载一个程序集,并运行其中的所有安装程序。
8[7P-Qpg*MR024        myassemblyinstaller.UseNewContext = true;
o#K j@6~cF025        myassemblyinstaller.Path = @"f:/gsw.exe";//服务所在的路径
a)T1J:C/2p1|?026        Hashtable mysavedstate = new Hashtable();
AcC5tV b6U027        myassemblyinstaller.Install(mysavedstate);ITPUB个人空间3X#N;I/k"m:[L)y4F
28        myassemblyinstaller.Commit(mysavedstate);ITPUB个人空间 La4L${7O$D8/a
29        myassemblyinstaller.Dispose();
3V/s"U@ g030        Response.Write("安装服务成功");
N JF,i]031   
$ip&T3G@032    }
6v c3Jm$y6_0g-[(VI033    protected void Button2_Click(object sender, EventArgs e)
2``N[ X&n034    {ITPUB个人空间L*m9Z-k{/xs
35        AssemblyInstaller myassemblyinstaller = new AssemblyInstaller();
#G,y}Z)/0q036        myassemblyinstaller.UseNewContext = true;
G!]Lo+Kw037        myassemblyinstaller.Path = @"f:/gsw.exe";//服务所在的路径ITPUB个人空间U[ U O /3Ii
38        myassemblyinstaller.CommandLine = new string[1] { "/u" };// 利用/u命令来完成卸载
zDb#gRS v039        myassemblyinstaller.Uninstall(null);
9aq ixG7QL040        myassemblyinstaller.Dispose();
%v!O nA0mz4u U7u041        Response.Write("卸载服务成功");
U(oCL:MWog&d042    }
yJwn k,I^043    protected void Button3_Click(object sender, EventArgs e)ITPUB个人空间&x8n7IsW2D&AR
44    {
.Sq9f[M/045        ServiceController sc = new ServiceController();//表示 Windows 服务并允许连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息。ITPUB个人空间&RXMv&|7/Z
46        sc.DisplayName = "桂素伟";ITPUB个人空间5[ D`hA0G
47        sc.ServiceName = "WriteTextService";
7mTo U`!E V{{y048        sc.Start();//启动这个名称的服务
-R6?X+SLE049        System.Threading.Thread.Sleep(1000);ITPUB个人空间bp[,G k
50        sc.Refresh();//刷新服务的状态
x.UO;PIE1B mD }9US051        if (sc.Status == ServiceControllerStatus.Running)//判断服务是已经运行ITPUB个人空间:Z'w&t_s
52        {ITPUB个人空间Tc}Q6C+k8we
53          Response .Write ("服务成功启动!");
K0Ly7K3qc,S(r+~-n B054        }
%b(GGS7b055    }
3^ a2J;~ I uC |(v056    protected void Button4_Click(object sender, EventArgs e)
&l!~"i#Q,f+q+pp057    {
x*qmr J a5I#u058        ServiceController sc = new ServiceController();
{] L0mq$EI059        sc.ServiceName = "WriteTextService";ITPUB个人空间B#W1k8Q Vv
60        sc.Stop();ITPUB个人空间6V/_$C Qj*P W(o
61      ITPUB个人空间W-[9ll(A/@:]|J
62        System.Threading.Thread.Sleep(1000);ITPUB个人空间Kr4B5^]L+JZ
63        sc.Refresh();//刷新服务的状态
1I5IUnM[a;Sk064        if (sc.Status == ServiceControllerStatus.Stopped)//判断服务是已经运行ITPUB个人空间h2/Y:PFKx&Lt
65        {ITPUB个人空间6S6d3gSQ|
66           Response .Write ("服务成功停止!");
G g ?Tf,gJ~067        }ITPUB个人空间NLS_!W;W7o#~ Q
68    }ITPUB个人空间~UQo;M4C a/{G-|
69}ITPUB个人空间a%s:O"iv
70ITPUB个人空间`W;a&?4y
 

我们是通过AssemblyInstaller类来完成对服务的装载和卸载,通过ServiceController类来完成对服务的启动和停止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值