要旨
Windowsサービスアプリをビルドする時は、ビルド前にサービスを停止する必要があります。Visual Studioのビルドイベントを書いて自動化すると楽です。
バッチコマンドで書くのはつらそうなので、PowerShellで書いてみました。
PowerShellのスクリプトをPrevBuild.ps1、AfterBuild.ps1として作成し、プロジェクトのプロパティでビルドイベントを設定します。
スクリプト
PrevBuild.ps1
# サービスが開始されていたら、停止する。 $status = (Get-Service "[サービス名]").Status if($status -eq "Running") { Stop-Service -Name "[サービス名]" }
AfterBuild.ps1
# Settingsフォルダを出力ディレクトリにコピーする。 -Recurse:ファイルごとコピーする、-Force:上書きコピーする Copy-Item ..\..\Settings .\ -Recurse -Force # サービスを開始する。 Start-Service -Name "[サービス名]"
ビルド前に実行するコマンドライン
REM -ExecutionPolicy RemoteSigned 作成したスクリプトは署名がなくても実行可能にする powershell -ExecutionPolicy RemoteSigned -File "$(ProjectDir)Batch\PrevBuild.ps1"
ビルド後に実行するコマンドライン
REM -ExecutionPolicy RemoteSigned 作成したスクリプトは署名がなくても実行可能にする powershell -ExecutionPolicy RemoteSigned -File "$(ProjectDir)Batch\AfterBuild.ps1"
まとめ
これで、ビルド前に自動的にサービスが停止し、ビルドされたEXEでサービスが起動するようになりました。