私は多くのWindowsサービスを構築しています。多くの理由の1つでは、サービス自体にコアコードを作成しません。サービスは本質的に「運用レイヤー」です。 DLLにコアコードを作成すると、その特定のコードのデバッグとテストが可能になります。開発段階とテスト段階で使用できるコアコードを実行するコンソールまたはデスクトップアプリケーションを作成できます。
個人的には、開始と停止の機能と一緒にログインをキャプチャするサービスランナーアプリケーションを作成しました。私のOnStartとOnStopのコードブロックは、文字通りサービスと同じです。
次に、サービスをテストすると、サービス(myService.exeなど)を開始してプロセスにアタッチできるはずです。ただし、デバッグビルドを使用してサービススレッドを一時停止または待機(たとえば30秒)する必要があるため、プロセスにアタッチする時間があり、初期化コードを忘れないようにする必要があります。ちょっと覚えておいてください。サービスをインストールしてから、Windowsのサービスマネージャーから起動する必要があります。
ここで私が使用する方向にあなたを指し示すかもしれないコードがあります。 service.csファイルのサービスでは、私は以下を使用します。サービスの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 –