Как мысль: я создал много служб Windows и по одной из многих причин я не создаю основной код в самой службе. Служба - это, по сути, «рабочий уровень», если хотите. Создание базового кода в dll позволяет отлаживать и тестировать этот конкретный код. Вы можете создать консольное или настольное приложение, которое будет запускать основной код, который можно использовать на этапах разработки и тестирования.
Лично я создал приложение сервис-бегун, которое фиксирует ведение журнала в сочетании с функциями запуска и остановки. Блоки кода OnStart и OnStop буквально идентичны кодам блока OnStart и OnStop.
Далее, при тестировании службы вы должны иметь возможность запустить службу (например, myService.exe) и подключиться к процессу. Тем не менее, еще одна заметка заключается в том, что вы должны приостановить/подождать поток службы (например, 30 секунд) с помощью сборки отладки, чтобы у вас было время для присоединения к процессу, и вы не пропустите свой код инициализации. Просто помните, что вам нужно установить свою службу, а затем запустить через диспетчер служб Windows.
Вот код, который может указать вам в том направлении, которое я использую. В файле service.cs службы я использую ниже; затем в методе Service OnStart() вы вызываете свою DLL и запускаете. Кроме того, вы можете остановить свою службу, заменить DLL на обновленную версию, а затем перезагрузить. С C# вы также можете заменить службу exe, но это только характеристики C#: на C++ вы не можете.
static class Program
{
public const string SERVICE_NAME = "myService";
public const string SERVICE_DISPLAY_NAME = "My Service";
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
if (args != null && args.Length > 0)
{
foreach (string arg in args)
{
switch (arg.ToLower())
{
case "-install":
ManageService(true);
return;
case "-remove":
ManageService(false);
return;
}
}
}
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service()
};
ServiceBase.Run(ServicesToRun);
}
private static void ManageService(bool bInstall)
{
string parms;
if (bInstall == true)
{
parms = string.Format("Create {0} type= own start= demand binPath= \"{1}\" DisplayName= \"{2}\"", SERVICE_NAME,
System.Reflection.Assembly.GetExecutingAssembly().Location, SERVICE_DISPLAY_NAME);
}
else // remove
{
parms = string.Format("Delete {0}", SERVICE_NAME);
}
try
{
string output = string.Empty;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("sc.exe", parms);
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = true;
proc.StartInfo = startInfo;
proc.Start();
output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit(10000);
if (proc.HasExited == true)
{
// NOTE: The project type has been changed from Windows Service to Console Application
// so that Console.WriteLine will output to the console
Console.WriteLine(output);
}
else
{
proc.Close();
Console.WriteLine("Timed out waiting to install service");
}
}
catch (System.ComponentModel.Win32Exception)
{
Console.WriteLine("Unable to locate sc.exe");
}
}
}
http://stackoverflow.com/questions/125964/easier-way-to-start-debugging-a-windows-service-in-c-sharp –