所以我们制作了一个 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 收到以下输出(仅相关部分):
运行事务安装。
开始安装的安装阶段。
正在安装服务应用服务二... 服务应用服务二已成功安装。在日志应用程序中创建 EventLog 源应用服务二...
安装阶段发生异常。System.NullReferenceException:对象引用未设置为对象的实例。
安装的回滚阶段即将开始。
将源应用服务二的事件日志恢复到以前的状态。正在从系统中删除服务应用服务二... 服务应用服务二已成功从系统中删除。
回滚阶段成功完成。
事务安装已完成。安装失败,已回滚。
很抱歉这篇冗长的帖子,想确保有足够的相关信息。到目前为止,让我感到困惑的是,它指出服务的安装成功完成,并且只有在它创建 EventLog 源之后才会抛出 NullReferenceException。因此,如果有人知道我做错了什么或有更好的方法,将不胜感激。