情境:
作为Windows服务运行的WCF服务。帐户是“用户”。
做了什么:
我已经覆盖了projectinstaller中的OnBeforeInstall,以便能够从配置文件中设置用户名和密码。
我能做什么:
我希望能够将starttype设置为Automatic(延迟启动)
我尝试了什么:
我将以下coderow放在重写的OnBeforeInstall
中 serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;
想象一下,我会把ServiceStartMode枚举变成代表自动(延迟启动),但是没有用。没有尝试过任何更简单的因为我找不到任何可以尝试的东西。
我在网上找到了什么:
我发现自动(延迟启动)将在.NET 4中可用,但这对我现在没有帮助。 MSDN 我发现可以将DelayedAutoStart添加到服务的配置键中,但如果我应该从代码中执行此操作,这感觉就像是一个黑客攻击。但也许这是目前唯一可用的解决方案?
任何想法?
Robert Persson,瑞典
答案 0 :(得分:37)
现在.NET 4.0就在这里:
serviceInstaller1.StartType = ServiceStartMode.Automatic;
serviceInstaller1.DelayedAutoStart = true;
答案 1 :(得分:5)
您唯一的另一个选择是使用P / invoke与SERVICE_CONFIG_DELAYED_AUTO_START_INFO
拨打ChangeServiceConfig2。但由于您似乎不愿意添加注册表项,我怀疑您是否想要使用P / invoke。没有其他方法可以从.NET Framework(< 4.0)中完成。
答案 2 :(得分:4)
对于我的.NET Framework 3.5项目,我可以通过手动设置服务的DelayedAutostart
值来将我的服务安装为“自动(延迟)”服务。例如:
public ProjectInstaller()
{
...
AfterInstall += ProjectInstaller_AfterInstall;
}
void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
string serviceName = <YourSpecific>Installer.ServiceName;
using (RegistryKey serviceKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Services\" + serviceName, true))
{
serviceKey.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
}
}
请注意,安装服务后,在重新启动计算机之前,服务不会列为“自动(延迟)”。
答案 3 :(得分:1)
我将在jdknight上稍微扩展一下。我在尝试他的解决方案时有写权限问题,所以这就是我所做的:
void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey("System", true); //Opens the System hive with writting permissions set to true
key = key.CreateSubKey("CurrentControlSet"); //CreateSubKey opens if subkey exists, otherwise it will create that subkey
key = key.CreateSubKey("services");
key = key.CreateSubKey(serviceInstaller1.ServiceName);
key.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
}
我还通过添加InstallEventHandler的新实例注册到AfterInstall事件。我不确定这是否真的有必要,但它也不会受到伤害:
AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);
就像.NET Framework 2.0上的魅力一样。如前所述,对于框架4及以上,使用
serviceInstaller1.DelayedAutoStart = true;
根据菲亚特的回答。