求教C#如何动态地创建多个Windows服务?

h744379120 2012-09-30 04:10:19
如果是静态地创建一个的话那是没有什么问题的,C#里新建一个Windows服务的工程就能简单的新建一个Windows服务出来了,但我想能不能通过动态的方式创建多个Windows服务?请问下有没谁搞过的?求教,谢谢!
...全文
286 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mngzilin 2012-09-30
  • 打赏
  • 举报
回复
ServiceBase obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;
if(obj!=null)
list.Add(obj);
mngzilin 2012-09-30
  • 打赏
  • 举报
回复
楼上正确,我随手写的,哈哈。

Object obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;
if(obj!=null)
list.Add((ServiceBase)obj);
qldsrx 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

刚才看到你问题中想要“动态创建服务”,这个是反射就能实现的,首先你有多个服务已经添加到项目中,比如:
Service1,Service2,Service3,....

然后你在program.cs中根据你的选择可以添加其中的几个服务,例如代码:
C# code
static class Program
{
/// <summary>
//……
[/Quote]
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继承的类型,则可以加载,这种方式就能达到你的目的。
h744379120 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
刚才看到你问题中想要“动态创建服务”,这个是反射就能实现的,首先你有多个服务已经添加到项目中,比如:
Service1,Service2,Service3,....

然后你在program.cs中根据你的选择可以添加其中的几个服务,例如代码:

C# code

static class Program
{
/// <summary>
……
[/Quote]

谢谢,我参考你的代码和思路修改看看~
mngzilin 2012-09-30
  • 打赏
  • 举报
回复
刚才看到你问题中想要“动态创建服务”,这个是反射就能实现的,首先你有多个服务已经添加到项目中,比如:
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());
}
}
h744379120 2012-09-30
  • 打赏
  • 举报
回复
不是任何程序都可以成为服务的,必须继承ServiceBase的类才行,而你说的动态创建是动态注册系统服务还是外部加载?外部加载的话,你需要监视本地文件夹,插件形式加载dll;动态注册很简单,只要sc命名执行即可。


说实话,我所谓的动态创建windows服务是想在一个Winform项目的一个Form窗体里通过一个“添加服务”的按钮来新增一个服务,对于你所说的"动态注册系统服务"和"外部加载"这两个专业的词语可以描述下是如何实现的吗?呵呵,今天中秋,祝中秋快乐!
h744379120 2012-09-30
  • 打赏
  • 举报
回复
属性---添加----新建项---windows服务,添加多个服务,然后在program.cs中把新添加的服务加进去就可以了。。。。
谢谢你!我试试哈~今天中秋哇,中秋快乐哇~
qldsrx 2012-09-30
  • 打赏
  • 举报
回复
不是任何程序都可以成为服务的,必须继承ServiceBase的类才行,而你说的动态创建是动态注册系统服务还是外部加载?外部加载的话,你需要监视本地文件夹,插件形式加载dll;动态注册很简单,只要sc命名执行即可。
mngzilin 2012-09-30
  • 打赏
  • 举报
回复
属性---添加----新建项---windows服务,添加多个服务,然后在program.cs中把新添加的服务加进去就可以了。。。。
mngzilin 2012-09-30
  • 打赏
  • 举报
回复
ServicesToRun = new ServiceBase[] { new FolderManagerServer1(),new FolderManagerServer2() };
mngzilin 2012-09-30
  • 打赏
  • 举报
回复
当然可以,你查看下工程下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()};中,添加多个服务

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧