如何用C#语言通过服务来实现开机启动?
在网上找了好长时间没找到,希望能有高手帮写个实例多谢!就是想写个小软件让他通过服务来实现开机启动。对C#服务不怎么懂希望高手写个实例有注释就更好了可追分。现在关于服务基本...
在网上找了好长时间没找到,希望能有高手帮写个实例
多谢!
就是想写个小软件让他通过服务来实现开机启动。
对C#服务不怎么懂 希望高手写个实例 有注释就更好了
可追分。
现在关于服务基本上了解一点了
最后就是
怎么样能再写一个软件来注册这个服务?
因为在现实应用中不可能再让用户这么麻烦的去注册和启动服务吧? 展开
多谢!
就是想写个小软件让他通过服务来实现开机启动。
对C#服务不怎么懂 希望高手写个实例 有注释就更好了
可追分。
现在关于服务基本上了解一点了
最后就是
怎么样能再写一个软件来注册这个服务?
因为在现实应用中不可能再让用户这么麻烦的去注册和启动服务吧? 展开
7个回答
展开全部
很多开机启动程序仅仅加在启动项里面,只有登陆后才真正启动。windows服务在开机未进行用户登录前就启动了。正是利用这一点,解决一些服务器自动重启后特定软件也自动启动的问题。
1.新建一个服务项目 visual C#----windows----windows服务;
2.添加一个dataset(.xsd),用于存储启动目标的路径,日志路径等。
在dataset可视化编辑中,添加一个datatable,包含两列 StartAppPath 和 LogFilePath。分别用于存储目标的路径、日志路径。
*我认为利用dataset.xsd存储配置参数的优势在于可以忽略xml解析的具体过程直接使用xml文件。
在dataset中 提供了ReadXml方法用于读取xml文件并将其转换成内存中的一张datatable表,数据很容易取出来!同样,WriteXml方法用于存储为xml格式的文件,也仅仅需要一句话而已。
3. program.cs文件 作为程序入口,代码如下:
view plaincopy to clipboardprint?
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };
ServiceBase.Run(ServicesToRun);
}
}
}
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };
ServiceBase.Run(ServicesToRun);
}
}
}
4.service.cs主文件,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
public partial class WindowsServices_AutoStart : ServiceBase
{
public WindowsServices_AutoStart()
{
InitializeComponent();
}
string StartAppPath =""; //@"F:\00.exe";
string LogFilePath ="";// @"f:\WindowsService.txt";
protected override void OnStart(string[] args)
{
string exePath = System.Threading.Thread.GetDomain().BaseDirectory;
//
if (!File.Exists(exePath + @"\ServiceAppPath.xml"))
{
dsAppPath ds = new dsAppPath();
object[] obj=new object[2];
obj[0]="0";
obj[1]="0";
ds.Tables["dtAppPath"].Rows.Add(obj);
ds.Tables["dtAppPath"].WriteXml(exePath + @"\ServiceAppPath.xml");
return;
}
try
{
dsAppPath ds = new dsAppPath();
ds.Tables["dtAppPath"].ReadXml(exePath + @"\ServiceAppPath.xml");
DataTable dt = ds.Tables["dtAppPath"];
StartAppPath = dt.Rows[0]["StartAppPath"].ToString();
LogFilePath = dt.Rows[0]["LogFilePath"].ToString();
}
catch { return; }
if (File.Exists(StartAppPath))
{
try
{
Process proc = new Process();
proc.StartInfo.FileName = StartAppPath; //注意路径
//proc.StartInfo.Arguments = "";
proc.Start();
}
catch (System.Exception ex)
{
//MessageBox.Show(this, "找不到帮助文件路径。文件是否被改动或删除?\n" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("WindowsService: Service Started" + DateTime.Now.ToString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
}
protected override void OnStop()
{
try
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("WindowsService: Service Stopped " + DateTime.Now.ToString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
catch
{
}
}
}
}
5.启动调试,成功时也会弹出一个对话框大致意思是提示服务需要安装。
6.把Debug文件夹下面的.exe执行程序,安装为windows系统服务,安装方法网上很多介绍。我说一种常用的:
安装服务
访问项目中的已编译可执行文件所在的目录。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil yourproject.exe
卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。
installutil /u yourproject.exe
至此,整个服务已经编写,编译,安装完成,你可以在控制面板的管理工具的服务中,看到你编写的服务。
7.安装好了之后在系统服务列表中可以管理服务,这时要注意将服务的属性窗口----登陆----“允许于桌面交互”勾选!这样才能在启动了你要的目标程序后不单单存留于进程。在桌面上也看得到。
8.关于卸载服务,目前有两个概念:一是禁用而已;一是完全删除服务。 前者可以通过服务管理窗口直接完成。后者则需要进入注册表“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”找到服务名称的文件夹,整个删掉,重新启动电脑后,服务消失。
9.扩展思考:经过修改代码,还可以实现:启动目标程序之前,检测进程中是否存在目标程序,存在则不再次启动
1.新建一个服务项目 visual C#----windows----windows服务;
2.添加一个dataset(.xsd),用于存储启动目标的路径,日志路径等。
在dataset可视化编辑中,添加一个datatable,包含两列 StartAppPath 和 LogFilePath。分别用于存储目标的路径、日志路径。
*我认为利用dataset.xsd存储配置参数的优势在于可以忽略xml解析的具体过程直接使用xml文件。
在dataset中 提供了ReadXml方法用于读取xml文件并将其转换成内存中的一张datatable表,数据很容易取出来!同样,WriteXml方法用于存储为xml格式的文件,也仅仅需要一句话而已。
3. program.cs文件 作为程序入口,代码如下:
view plaincopy to clipboardprint?
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };
ServiceBase.Run(ServicesToRun);
}
}
}
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new WindowsServices_AutoStart() };
ServiceBase.Run(ServicesToRun);
}
}
}
4.service.cs主文件,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
namespace WindowsServices_AutoStart
{
public partial class WindowsServices_AutoStart : ServiceBase
{
public WindowsServices_AutoStart()
{
InitializeComponent();
}
string StartAppPath =""; //@"F:\00.exe";
string LogFilePath ="";// @"f:\WindowsService.txt";
protected override void OnStart(string[] args)
{
string exePath = System.Threading.Thread.GetDomain().BaseDirectory;
//
if (!File.Exists(exePath + @"\ServiceAppPath.xml"))
{
dsAppPath ds = new dsAppPath();
object[] obj=new object[2];
obj[0]="0";
obj[1]="0";
ds.Tables["dtAppPath"].Rows.Add(obj);
ds.Tables["dtAppPath"].WriteXml(exePath + @"\ServiceAppPath.xml");
return;
}
try
{
dsAppPath ds = new dsAppPath();
ds.Tables["dtAppPath"].ReadXml(exePath + @"\ServiceAppPath.xml");
DataTable dt = ds.Tables["dtAppPath"];
StartAppPath = dt.Rows[0]["StartAppPath"].ToString();
LogFilePath = dt.Rows[0]["LogFilePath"].ToString();
}
catch { return; }
if (File.Exists(StartAppPath))
{
try
{
Process proc = new Process();
proc.StartInfo.FileName = StartAppPath; //注意路径
//proc.StartInfo.Arguments = "";
proc.Start();
}
catch (System.Exception ex)
{
//MessageBox.Show(this, "找不到帮助文件路径。文件是否被改动或删除?\n" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("WindowsService: Service Started" + DateTime.Now.ToString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
}
protected override void OnStop()
{
try
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
FileStream fs = new FileStream(LogFilePath, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("WindowsService: Service Stopped " + DateTime.Now.ToString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
catch
{
}
}
}
}
5.启动调试,成功时也会弹出一个对话框大致意思是提示服务需要安装。
6.把Debug文件夹下面的.exe执行程序,安装为windows系统服务,安装方法网上很多介绍。我说一种常用的:
安装服务
访问项目中的已编译可执行文件所在的目录。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil yourproject.exe
卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。
installutil /u yourproject.exe
至此,整个服务已经编写,编译,安装完成,你可以在控制面板的管理工具的服务中,看到你编写的服务。
7.安装好了之后在系统服务列表中可以管理服务,这时要注意将服务的属性窗口----登陆----“允许于桌面交互”勾选!这样才能在启动了你要的目标程序后不单单存留于进程。在桌面上也看得到。
8.关于卸载服务,目前有两个概念:一是禁用而已;一是完全删除服务。 前者可以通过服务管理窗口直接完成。后者则需要进入注册表“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”找到服务名称的文件夹,整个删掉,重新启动电脑后,服务消失。
9.扩展思考:经过修改代码,还可以实现:启动目标程序之前,检测进程中是否存在目标程序,存在则不再次启动
展开全部
楼主,你好,你按照下面的方法做,一定成功。祝你愉快!
创建服务步骤:
1.先在VS中创建一个Windows服务的项目,在自动生成的service1.cs文件里添加如下语句:
//定义一个全局变量
string StartAppPath = @"C:\Program Files\QQb.exe"; 注释:该路径是你的小软件的exe 。
Process proc = new Process();
2.在OnStart()函数中添加如下代码
try
{
proc.StartInfo.FileName = StartAppPath; //注意路径
proc.Start();
}
catch (System.Exception ex)
{
//错误处理
}
3.在OnStop() 函数中添加如下代码
Proc.kill(); //关闭进程
4.击Service1.cs打开设计视图,在设计视图中右键,选择添加 安装程序,然后在生成的ProjectInstaller.Designer.cs文件中的InitializeComponent()函数下添加如下代码
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; //权限账户设置
this.serviceInstaller1.ServiceName = "MYservice"; //我的服务名称,这个名字你说了算
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; //服务自动运行
5. 好了,现在可以编译生成exe了,下面要用cmd命令将刚才写的这个Windows服务安装并启动:
设置自动启动
第一步:cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
注释:跳转到指定目录下。
第二步:InstallUtil C:\QQ_WinService.exe
注意("C:\QQ_WinService.exe “ 是你服务的exe文件)
net strat MYservice //开启服务
我是在网上找到的,我也这样做,成功了的。
创建服务步骤:
1.先在VS中创建一个Windows服务的项目,在自动生成的service1.cs文件里添加如下语句:
//定义一个全局变量
string StartAppPath = @"C:\Program Files\QQb.exe"; 注释:该路径是你的小软件的exe 。
Process proc = new Process();
2.在OnStart()函数中添加如下代码
try
{
proc.StartInfo.FileName = StartAppPath; //注意路径
proc.Start();
}
catch (System.Exception ex)
{
//错误处理
}
3.在OnStop() 函数中添加如下代码
Proc.kill(); //关闭进程
4.击Service1.cs打开设计视图,在设计视图中右键,选择添加 安装程序,然后在生成的ProjectInstaller.Designer.cs文件中的InitializeComponent()函数下添加如下代码
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; //权限账户设置
this.serviceInstaller1.ServiceName = "MYservice"; //我的服务名称,这个名字你说了算
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; //服务自动运行
5. 好了,现在可以编译生成exe了,下面要用cmd命令将刚才写的这个Windows服务安装并启动:
设置自动启动
第一步:cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
注释:跳转到指定目录下。
第二步:InstallUtil C:\QQ_WinService.exe
注意("C:\QQ_WinService.exe “ 是你服务的exe文件)
net strat MYservice //开启服务
我是在网上找到的,我也这样做,成功了的。
追问
先谢了
然后还有一点就是 能不能不用cmd形式注册和启动服务 能不能再写一个软件来注册这个服务?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-04-20
展开全部
那里刷机,刷个高版本的系统!你现在的系统存在BUG!
另外,站长团上有产品团购,便宜有保证
另外,站长团上有产品团购,便宜有保证
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
写windows服务,设置为自动运行就可以开机启动了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
private void button1_Click(object sender, EventArgs e)
{
RunWhenStart(true, "我的快捷工具箱", @"F:\源代码\我的快捷工具箱\我的快捷工具箱\bin\Debug\我的快捷工具箱.exe"); //调用发放 ,程序名以及路径
}
//实现开机自启动功能方法,直接使用下面的发放就可以
public void RunWhenStart(bool Started, string name, string path)
{
RegistryKey HKLM = Registry.LocalMachine;
RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
if (Started == true)
{
try
{
Run.SetValue(name, path);
HKLM.Close();
MessageBox.Show("已成功设置开机自启动");
}
catch (System.Exception ex)
{
MessageBox.Show("注册表修改错误,未实现开机自启动");
}
}
else
{
try
{
if (Run.GetValue(name) != "")
{
Run.DeleteValue(name);
HKLM.Close();
}
else return;
}
catch (System.Exception ex)
{
}
}
}
{
RunWhenStart(true, "我的快捷工具箱", @"F:\源代码\我的快捷工具箱\我的快捷工具箱\bin\Debug\我的快捷工具箱.exe"); //调用发放 ,程序名以及路径
}
//实现开机自启动功能方法,直接使用下面的发放就可以
public void RunWhenStart(bool Started, string name, string path)
{
RegistryKey HKLM = Registry.LocalMachine;
RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
if (Started == true)
{
try
{
Run.SetValue(name, path);
HKLM.Close();
MessageBox.Show("已成功设置开机自启动");
}
catch (System.Exception ex)
{
MessageBox.Show("注册表修改错误,未实现开机自启动");
}
}
else
{
try
{
if (Run.GetValue(name) != "")
{
Run.DeleteValue(name);
HKLM.Close();
}
else return;
}
catch (System.Exception ex)
{
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询