我需要能够在一台计算机上多次安装相同的服务。 那部分我工作了!但我也需要ServiceName与众不同。那部分不是。
以下是我的Installer.cs中的代码:
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
InitializeComponent();
}
public override void Install(IDictionary stateSaver)
{
RetrieveServiceName();
base.Install(stateSaver);
}
public override void Uninstall(IDictionary savedState)
{
RetrieveServiceName();
base.Uninstall(savedState);
}
private void RetrieveServiceName()
{
var serviceName = Context.Parameters["servicename"];
if(!string.IsNullOrEmpty(serviceName))
{
auditStreamServiceInstaller.ServiceName = serviceName;
auditStreamServiceInstaller.DisplayName = serviceName;
}
}
}
我使用以下cmd来安装服务
C:\Windows\Microsoft.Net\Framework\v4.0.30319> installutil /servicename="AuditStream-NW" d:AuditStreamService.exe
现在,如果我查看installlog:
Affected parameters are:
logtoconsole =
logfile = C:\AuditStreams\NW\AuditStreamService.InstallLog
assemblypath = C:\AuditStreams\NW\AuditStreamService.exe
servicename = AuditStream-NW
这看起来是正确的,但在我的服务OnStart中,我有一行将ServiceName输出到个人日志文件。但它表示ServiceName始终是AuditStreamService
我本来希望在这种情况下说AuditStream-NW ...谁能看到我的错误?
EXTRA:
我希望这些名称不同的原因是因为每个服务还创建了一个MemoryMappedFile,最初我设置了它,因此该非持久性mmf的名称始终为"AuditStream-" + HubName
(在配置文件中确定),但是外部程序现在将通过读取mmf监视服务正在做什么,但除了读取服务配置文件外,外部应用程序不知道mmf的名称。我的目标是使所有名称相同,ServiceName = MMF Name = ServiceDisplayName
。
答案 0 :(得分:0)
好吧事实证明我的安装过程很好,我只是不能在OnStart()中使用this.ServiceName变量,因为它总是返回通用默认名称而不是安装期间选择的名称。以下代码是我用来获取真实姓名的代码:
int myPid = Process.GetCurrentProcess().Id;
var services = ServiceController.GetServices();
foreach (var service in services)
{
ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + service.ServiceName + "'");
wmiService.Get();
if (Convert.ToInt32(wmiService["ProcessId"]) == myPid)
myServiceName = service.ServiceName;
}