Ответ 1
Теперь, когда .NET 4.0 находится здесь:
serviceInstaller1.StartType = ServiceStartMode.Automatic;
serviceInstaller1.DelayedAutoStart = true;
Сценарий:
Служба WCF работает как служба Windows. Учетная запись "Пользователь".
Что сделано:
Я переопределил OnBeforeInstall в projectinstaller, чтобы иметь возможность устанавливать имя пользователя и пароль из файла конфигурации.
Что я мог бы сделать:
Я хотел бы установить тип старта как Автоматический (Задержанный запуск)
Что я пробовал:
Я положил следующий код в переопределенном OnBeforeInstall
serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;
Рисунок, который я обманул бы перечислением ServiceStartMode в представлении Automatic (Delayed Start), не работал. Не пробовал ничего проще, потому что я не мог найти ничего, чтобы попробовать.
Что я нашел в сети:
Я узнал, что Automatic (Delayed Start) будет доступен в .NET 4, но это мне не помогает прямо сейчас. MSDN Я узнал, что DelayedAutoStart можно добавить в ключ конфигурации службы, но это похоже на взлом, если я должен сделать это из кода. Но, возможно, это единственное решение, доступное для меня на этом этапе?
Любые идеи?
Роберт Перссон, Швеция
Теперь, когда .NET 4.0 находится здесь:
serviceInstaller1.StartType = ServiceStartMode.Automatic;
serviceInstaller1.DelayedAutoStart = true;
Единственный другой вариант - использовать P/invoke для вызова ChangeServiceConfig2 с SERVICE_CONFIG_DELAYED_AUTO_START_INFO
. Но поскольку вы, похоже, не хотите добавлять запись в реестр, я сомневаюсь, что вы захотите использовать P/invoke. Нет другого способа сделать это из .NET Framework (< 4.0).
Для моего проекта .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);
}
}
Обратите внимание, что после установки службы служба не будет указана как "Автоматическая (отложенная)" до после перезапуска компьютера.
Я расскажу немного о 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);
}
}
Я также зарегистрировался в событии AfterInstall, добавив новый экземпляр InstallEventHandler. Я не уверен, что это действительно необходимо, но это тоже не повредит:
AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);
Работает как шарм на платформе .NET Framework 2.0. Как уже указывалось ранее, для фреймворков 4 и выше используйте
serviceInstaller1.DelayedAutoStart = true;
согласно ответу fiat.