如果是静态地创建一个的话那是没有什么问题的,C#里新建一个Windows服务的工程就能简单的新建一个Windows服务出来了,但我想能不能通过动态的方式创建多个Windows服务?请问下有没谁搞过的?求教,谢谢!

解决方案 »

  1.   

    当然可以,你查看下工程下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()};中,添加多个服务
      

  2.   

    ServicesToRun = new ServiceBase[] { new FolderManagerServer1(),new FolderManagerServer2() };
      

  3.   

    属性---添加----新建项---windows服务,添加多个服务,然后在program.cs中把新添加的服务加进去就可以了。
      

  4.   

    不是任何程序都可以成为服务的,必须继承ServiceBase的类才行,而你说的动态创建是动态注册系统服务还是外部加载?外部加载的话,你需要监视本地文件夹,插件形式加载dll;动态注册很简单,只要sc命名执行即可。
      

  5.   

    属性---添加----新建项---windows服务,添加多个服务,然后在program.cs中把新添加的服务加进去就可以了。
    谢谢你!我试试哈~今天中秋哇,中秋快乐哇~
      

  6.   

    不是任何程序都可以成为服务的,必须继承ServiceBase的类才行,而你说的动态创建是动态注册系统服务还是外部加载?外部加载的话,你需要监视本地文件夹,插件形式加载dll;动态注册很简单,只要sc命名执行即可。
    说实话,我所谓的动态创建windows服务是想在一个Winform项目的一个Form窗体里通过一个“添加服务”的按钮来新增一个服务,对于你所说的"动态注册系统服务"和"外部加载"这两个专业的词语可以描述下是如何实现的吗?呵呵,今天中秋,祝中秋快乐!
      

  7.   

    刚才看到你问题中想要“动态创建服务”,这个是反射就能实现的,首先你有多个服务已经添加到项目中,比如:
    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());
            }
        }
      

  8.   

    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继承的类型,则可以加载,这种方式就能达到你的目的。
      

  9.   

    楼上正确,我随手写的,哈哈。Object obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;
    if(obj!=null)
         list.Add((ServiceBase)obj);
      

  10.   

    ServiceBase obj = assembly.CreateInstance("SW.Services." + s) as ServiceBase;
    if(obj!=null)
         list.Add(obj);