因此,我们已经制作了一个Windows服务,可将数据提供给客户端应用程序,并且一切进展顺利。客户端提出了一个有趣的配置请求,该请求要求该服务的两个实例在同一服务器上运行,并配置为指向单独的数据库。
到目前为止,我还没有做到这一点,并希望我的stackoverflow同行成员可能对为什么给出一些提示。
当前设置:
我已经设置了包含Windows服务的项目,从现在开始我们将其称为AppService,而ProjectInstaller.cs文件将处理自定义安装步骤,以基于App.config中的键来设置服务名称,如下所示: :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
在这种情况下,Util只是一个静态类,可以从配置文件中加载服务名称。
从这里开始,我尝试了两种不同的方法来安装两个服务,并且都以相同的方式失败了。
第一种方法是简单地安装服务的第一个副本,复制安装的目录并重命名它,然后在修改应用程序配置以更改所需的服务名称后运行以下命令:
InstallUtil.exe /i AppService.exe
如果不起作用,我尝试创建第二个安装程序项目,编辑配置文件并构建第二个安装程序。当我运行安装程序时,它运行良好,但该服务未显示在services.msc中,因此我针对第二个已安装的代码库运行了先前的命令。
两次我都从InstallUtil收到以下输出(仅相关部分):
运行事务处理的安装。
开始安装的安装阶段。
正在安装service App Service Two ... Service App Service Two已成功安装。在日志应用程序中创建EventLog源App Service二...
在安装阶段发生异常。System.NullReferenceException:对象引用未设置为对象的实例。
安装的回滚阶段开始。
将事件日志恢复到源应用程序服务二的先前状态。正在从系统中删除Service App服务二...已成功从系统中删除Service App服务二。
回滚阶段已成功完成。
事务处理安装已完成。安装失败,并且已执行回滚。
很抱歉,冗长的帖子,希望确保有足够的相关信息。到目前为止,我感到很困惑的一点是,它指出该服务的安装成功完成,并且只有在它创建EventLog源之后才抛出NullReferenceException。因此,如果有人知道我在做什么错或有更好的方法,将不胜感激。
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
。您可以将代码插入安装程序中,以获取运行installutil时所需的服务名称。