因此,我们已经生成了一个 Windows 服务,将数据提供给我们的客户端应用程序,一切都进展顺利。客户机提出了一个有趣的配置请求,该请求要求此服务的两个实例在同一台服务器上运行,并配置为指向不同的数据库。
到目前为止,我还没有能够让这种情况发生,并希望我的堆栈溢出成员可以提供一些线索,为什么。
当前设置:
我已经设置了包含 windows 服务的项目,从现在开始我们称之为 AppService,以及处理自定义安装步骤的 projectinstaller.cs 文件,它根据 App.config 中的一个键来设置服务名称,如下所示:
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
在这种情况下,Util 只是一个静态类,它从配置文件中加载服务名称。
从现在开始,我尝试了两种不同的方法来安装这两个服务,但都以同样的方式失败了。
第一种方法是简单地安装服务的第一个副本,复制已安装的目录并重命名它,然后在修改 app 配置以更改所需的服务名称之后运行以下命令:
InstallUtil.exe /i AppService.exe
当这不起作用时,我尝试创建第二个安装程序项目,编辑配置文件并构建第二个安装程序。当我运行安装程序时,它工作得很好,但是在 services.msc 中没有显示服务,所以我对第二个安装的代码库运行了前面的命令。
两次我都收到了 InstallUtil 的以下输出(只有相关部分) :
运行事务处理安装。
开始安装的安装阶段。
安装服务应用程序服务二..。 ServiceAppServiceTwo 已成功安装。 在日志应用程序中创建 EventLog 源 AppServiceTwo..。
在安装阶段发生异常。 System.NullReferenceException: 对象引用未设置为对象的实例。
安装的回滚阶段已经开始。
将源 AppServiceTwo 的事件日志还原到以前的状态。 服务应用程序服务二正在从系统中删除..。 ServiceAppServiceTwo 已成功从系统中删除。
回滚阶段成功完成。
事务处理的安装已经完成。 安装失败,已执行回滚。
抱歉文章冗长,想确保有足够的相关信息。到目前为止,让我感到困惑的是,它声明服务的安装成功完成,并且只有在它创建了 EventLog 源之后,才会抛出 NullReferenceException 异常。因此,如果有人知道我做错了什么,或者有更好的方法,我将不胜感激。