Как сделать службу Windows с параметрами?
Я написал службу Windows, из которой я хочу иметь 1 экземпляр для каждого клиента. Это связано с тем, что у каждого клиента есть своя БД с идентичными схемами; единственная разница между службами Windows заключается в том, что каждый из них будет иметь другой параметр, соответствующий БД клиента, который они предназначены для обслуживания. (И я не могу иметь одну службу с несколькими рабочими потоками, потому что соединение с БД использует статическую переменную, которую я не могу обсуждать с помощью потоков.)
Я нашел этот аккуратный небольшой учебник о том, как сделать службу Windows, но он показывает только, как настроить его для одной службы, Я хочу настроить n экземпляров службы, каждая из которых имеет отображаемое имя, которое включает имя клиента, работающего с параметром командной строки, который обозначает идентификатор клиента.
В приведенном выше учебном руководстве есть класс под названием MyWindowsServiceInstaller
, который устанавливает службу Windows в локальной системе, и я предполагаю, что это было бы логичным местом для создания цикла foreach
для всех моих клиентов, установки по одному сервису для каждого. Но я не вижу нигде на интерфейсах, которые позволили бы мне настроить параметр командной строки для новой службы.
Как вы это делаете?
Ответы
Ответ 1
Уил Пек написал хорошую статью о том, как установить несколько экземпляров службы Windows в одном окне. Основная идея заключается в том, что вы должны обмануть установщика, думая, что они разные службы, давая им разные имена.
Сказав это, кажется, было бы проще (и более ремонтопригодным) перепроектировать код подключения к базе данных, чтобы он мог поддерживать несколько рабочих потоков.
Ответ 2
Все, что я хотел, это отправить один параметр в созданную службу.
Как оказалось, все, что вам нужно сделать (осторожно!) Изменить реестр на HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и добавить параметр в ImagePath после кавычек.
Eg. ImagePath Value Data: "C:\Program Files\myservice\myservice.exe" param1
Я нашел решение в этой ссылке http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/38242afa-7e40-4c06-975e-aa97d3cc782f
Ответ 3
Вам в основном нужно установить службу несколько раз и настроить ее с помощью файла exe.config.
Кроме того, у вас может быть одна служба, которая запускает разные рабочие потоки для каждого клиента.
Обновление
exe.Config - это Файл конфигурации приложения
Я понятия не имею, как использовать этот компонент установщика для установки нескольких экземпляров службы, я не знал, что вы могли.
Если нам нужно несколько экземпляров одного из наших сервисов для запуска на одной машине, мы на самом деле устанавливаем его только один раз, а затем буквально копируем установленную папку и меняем имя exe для второго экземпляра. Второй экземпляр затем настроен в собственном файле конфигурации приложения.
Ответ 4
Насколько я знаю, невозможно задать параметры запуска с помощью ServiceInstaller
, ServiceProcessInstaller
или installutil
. Тем не менее, можно указать параметры запуска с помощью некоторого COM api из advapi.dll (проверьте меню слева). Полный набор необходимых вызовов можно найти здесь. Это класс (также), называемый ServiceInstaller
, который содержит необходимые внешние методы и некоторые полезные методы.
Вы хотите использовать метод утилиты InstallAndStart
. Он принимает имя службы, отображаемое имя и путь к исполняемому файлу, который представляет вашу службу Windows. Вы можете назвать это следующим образом:
InstallAndStart("MyService", "My Service For User 1",
"c:\\pathtoexe\MyService.exe user1");
Если у вас есть следующая услуга, параметр startupParam
получит значение user1
.
class Program : ServiceBase
{
private string startupParam;
static void Main(string[] args)
{
string arg = args[0];
ServiceBase.Run(new Program(arg));
}
public Program(string startupParam)
{
this.ServiceName = "MyService";
this.startupParam = startupParam;
}
...
}
Ответ 5
Если вы используете сторонние инструменты, вы можете попробовать http://installer.codeeffects.com. Они позволяют вам устанавливать установщик .exe для вашей службы Windows и добавлять параметры в пользовательский интерфейс установщика. Кроме того, вам не нужно разрабатывать собственный проект настройки. Надеюсь, это поможет.