Ну, прошло около 10 месяцев после того, как вы опубликовали, и у меня возникла та же проблема.Прочитав эту и другие темы, я решил посмотреть, что делает .NET Framework за кулисами, и убедился, что документированного способа сделать это не существует.Есть;однако, очень простой недокументированный способ сделать это.В родительском классе Installer либо переопределите метод Install, либо внедрите событие BeforeInstall.Неважно, какой, вы можете использовать одно из следующих:
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
base.Context.Parameters["assemblyPath"] = string.Format("\"{0}\" /service", base.Context.Parameters["assemblyPath"]);
}
или:
private void Installer_BeforeInstall(object sender, InstallEventArgs e)
{
base.Context.Parameters["assemblyPath"] = string.Format("\"{0}\" /service", base.Context.Parameters["assemblyPath"]);
}
Параметр "assemblyPath" будет инициализирован с полным путем к исполняемому файлуиз класса AssemblyInstaller.Значение этого параметра записывается в значение ImagePath в реестре.Кавычки будут помещены вокруг этого значения, если таковые не существуют, поэтому убедитесь, что вы размещаете их там, где они вам нужны (то есть, по крайней мере, вокруг начального значения).В приведенной выше строке я поместил кавычки вокруг пути к исполняемому файлу и добавил «/ service» в конец в качестве параметра.
Это будет применяться ко всем службам, которые используют этот родительский класс Installer.Если у вас есть сервисы, в которые вы не хотите добавлять параметры или которым требуются другие параметры, вы можете вложить классы Installer и поместить в них код вместо корневого класса Installer.Это нигде не задокументировано, возможно, может сломаться в будущем и может не работать на версиях .NET Framework, выпущенных не Microsoft, но пока работает.
Надеюсь, это поможет.