概要
Windows Seriviceを過去にC++で開発していた時は、
インストール処理も実装していました。
C#でのWindows Service開発では、テンプレートがあって、
サービス自体はとても簡単に作成できますが、
なぜかテンプレートにはインストール処理は実装されていなくて。
今回はその処理を実装した話。
やること
テンプレートで生成されたコードから変更した点を記載します。
・Main関数に引数を追加し、起動時引数での分岐を作成
・起動時引数で「install」が指定された場合に、インストール処理を実行するようにする。
※XXXXXXXXServiceが開発するサービスのクラス名
インストール処理は、実行ファイル名を取得して
ManagedInstallerClassクラスのInstallHelper関数を呼び出すだけ。
namespace XXXXXXXXService
{
static class Program
{
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new XXXXXXXXService()
};
switch (args[0])
{
case "install":
string[] args = { System.Reflection.Assembly.GetExecutingAssembly().Location };
ManagedInstallerClass.InstallHelper(args);
break;
default:
ServiceBase.Run(ServicesToRun);
break;
}
}
}
}
あ、Program.csに以下も追記しておいてくださいね。
using System.Configuration.Install;
起動時引数にinstallを指定して実行してみます。
※管理者権限で実行してください。
また、Visual Studioから実行する際は、Visual Studioを管理者権限で実行してくださいね。
今回は管理者権限のあるユーザー名とパスワードを入力したのですが、
ここで注意点があります。
ユーザー名は先頭にコンピューター名+¥マークをつける必要があります。
例えば、コンピューター名がaaa、ユーザー名がbbbであれば、
aaa¥bbb
をユーザー名に入力します。
なお、コンピューター名は設定->システム->バージョン情報で確認できます。
このソースでは、既にインストールされているかの確認処理や、エラーになった時の処理は記載していないので、
必要に応じて実装してください。