求教C#如何动态地创建多个Windows服务? 如果是静态地创建一个的话那是没有什么问题的,C#里新建一个Windows服务的工程就能简单的新建一个Windows服务出来了,但我想能不能通过动态的方式创建多个Windows服务?请问下有没谁搞过的?求教,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当然可以,你查看下工程下Program.cs文件就会发现: static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> static void Main() { ServiceBase[] ServicesToRun; // 同一进程中可以运行多个用户服务。若要将 // 另一个服务添加到此进程中,请更改下行以 // 创建另一个服务对象。例如, // // ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()}; // ServicesToRun = new ServiceBase[] { new FolderManagerServer() }; ServiceBase.Run(ServicesToRun); } }很显然ServiceBase[] ServicesToRun就是一个服务的集合,你可以在ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};中,添加多个服务 ServicesToRun = new ServiceBase[] { new FolderManagerServer1(),new FolderManagerServer2() }; 属性---添加----新建项---windows服务,添加多个服务,然后在program.cs中把新添加的服务加进去就可以了。 不是任何程序都可以成为服务的,必须继承ServiceBase的类才行,而你说的动态创建是动态注册系统服务还是外部加载?外部加载的话,你需要监视本地文件夹,插件形式加载dll;动态注册很简单,只要sc命名执行即可。 属性---添加----新建项---windows服务,添加多个服务,然后在program.cs中把新添加的服务加进去就可以了。谢谢你!我试试哈~今天中秋哇,中秋快乐哇~ 不是任何程序都可以成为服务的,必须继承ServiceBase的类才行,而你说的动态创建是动态注册系统服务还是外部加载?外部加载的话,你需要监视本地文件夹,插件形式加载dll;动态注册很简单,只要sc命名执行即可。说实话,我所谓的动态创建windows服务是想在一个Winform项目的一个Form窗体里通过一个“添加服务”的按钮来新增一个服务,对于你所说的"动态注册系统服务"和"外部加载"这两个专业的词语可以描述下是如何实现的吗?呵呵,今天中秋,祝中秋快乐! 刚才看到你问题中想要“动态创建服务”,这个是反射就能实现的,首先你有多个服务已经添加到项目中,比如:Service1,Service2,Service3,....然后你在program.cs中根据你的选择可以添加其中的几个服务,例如代码: static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> static void Main() { //可以动态添加服务类名称 List<string> listStr = new List<string>(); listStr.Add("Service1"); listStr.Add("Service2"); listStr.Add("Service3"); //动态创建服务实例 List<ServiceBase> listService = new List<ServiceBase>(); Assembly assembly = Assembly.Load("SW.Services"); foreach (string s in listStr) { ServiceBase obj = (ServiceBase)assembly.CreateInstance("SW.Services." + s); if (obj != null) { listService.Add(obj); } } //开始运行服务 ServiceBase.Run(listService.ToArray()); } } ServiceBase obj = (ServiceBase)assembly.CreateInstance("SW.Services." + s);这句话有问题,不能强制转换,否则必然报错,正确的写法应该是ServiceBase obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;不过即使这样我还是不赞成那种写法,应该在CreateInstance之前就判断类型,不然你怎么知道那个CreateInstance就一定成功?——接口和抽象类必定报错。To 楼主:我说的插件形式加载dll其实类似他那个方法,也就是先遍历给定的目录,查找所有dll文件,调用Assembly.LoadFrom方法加载dll,如果成功,则在Assembly内部查找类型,如果有ServiceBase继承的类型,则可以加载,这种方式就能达到你的目的。 楼上正确,我随手写的,哈哈。Object obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;if(obj!=null) list.Add((ServiceBase)obj); ServiceBase obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;if(obj!=null) list.Add(obj); C#抓取页面,碰到JS调用Flash函数 jquery统计在线人数 三层架构问题 如何在c#中写sql语句啊? 保存图像问题? 如何用C#编程取得ftp服务器的时间? 关于线程池的问题,请教大家 推荐本书看一下 我用想把启动进程的一些信息写到打开的文本内去,如何处理? VS2019创建xUnit单元测试无法使用,求大神解答怎么解决 求大神找错 如何获取网页中指定元素的字符
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun; // 同一进程中可以运行多个用户服务。若要将
// 另一个服务添加到此进程中,请更改下行以
// 创建另一个服务对象。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new FolderManagerServer() }; ServiceBase.Run(ServicesToRun);
}
}很显然ServiceBase[] ServicesToRun就是一个服务的集合,你可以在ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};中,添加多个服务
谢谢你!我试试哈~今天中秋哇,中秋快乐哇~
说实话,我所谓的动态创建windows服务是想在一个Winform项目的一个Form窗体里通过一个“添加服务”的按钮来新增一个服务,对于你所说的"动态注册系统服务"和"外部加载"这两个专业的词语可以描述下是如何实现的吗?呵呵,今天中秋,祝中秋快乐!
Service1,Service2,Service3,....然后你在program.cs中根据你的选择可以添加其中的几个服务,例如代码:
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
//可以动态添加服务类名称
List<string> listStr = new List<string>();
listStr.Add("Service1");
listStr.Add("Service2");
listStr.Add("Service3");
//动态创建服务实例
List<ServiceBase> listService = new List<ServiceBase>();
Assembly assembly = Assembly.Load("SW.Services");
foreach (string s in listStr)
{
ServiceBase obj = (ServiceBase)assembly.CreateInstance("SW.Services." + s);
if (obj != null)
{
listService.Add(obj);
}
}
//开始运行服务
ServiceBase.Run(listService.ToArray());
}
}
这句话有问题,不能强制转换,否则必然报错,正确的写法应该是
ServiceBase obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;
不过即使这样我还是不赞成那种写法,应该在CreateInstance之前就判断类型,不然你怎么知道那个CreateInstance就一定成功?——接口和抽象类必定报错。To 楼主:我说的插件形式加载dll其实类似他那个方法,也就是先遍历给定的目录,查找所有dll文件,调用Assembly.LoadFrom方法加载dll,如果成功,则在Assembly内部查找类型,如果有ServiceBase继承的类型,则可以加载,这种方式就能达到你的目的。
if(obj!=null)
list.Add((ServiceBase)obj);
if(obj!=null)
list.Add(obj);