非常に単純な.NETWindowsサービスを作成し、InstallUtil.exeユーティリティを使用してインストールしました。
サービスには、次のようなコードがあります。
if (File.Exists("test_file.txt"))
{
// Do something clever
}
サービスと同じディレクトリにtest_file.txtというファイルを作成しましたが、コードのコメント部分が実行されません...?
回答:
サービスは、サービスコントロールマネージャーと呼ばれるアプリケーションから開始されます。このアプリケーションは、システムディレクトリ%WinDir%\ System32にあります。
Windows 7 Ultimateの場合-64ビットこのパスは実際には:%WinDir%\ SysWOW64
詳細については、MSDNのサービスコントロールマネージャーを参照してください。
元の投稿の問題を指摘してくれたHarperShelbyに感謝します。
%WinDir%\SysWOW64
代わりに
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());
現在のディレクトリを出力します。そのコードをサービスの起動メソッドに配置し、DebugViewなどのツールを使用して出力を確認します。そうすれば、サービスのスタートアップフォルダがわかります。
この単純な手法は、サービス開発における多くの問題、特にサービスの起動をデバッグする場合に役立ちます。
おそらく、サービスの作業フォルダーは、サービスの実行可能ファイルが含まれているフォルダーであると予想していました(私もそうしました)。次のコード行を使用して、そのフォルダーに変更できます。
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
また、Windowsサービスが実行されているフォルダーを知りたいのですが、ソースコードが私のものではなかったため、変更できませんでした。コマンドプロンプトで入力sc qc <service name>
すると、BINARY_PATH_NAMEにフォルダが表示されます。
C:\>sc qc
DESCRIPTION:
Queries the configuration information for a service.
USAGE:
sc <server> qc [service name] <bufferSize>
MyServiceをクエリすると、次のようになります。
C:> sc qc MyService
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: MyService
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "D:\Routines\MyService\MyService.exe"
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : MyService
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
sc qc apache2.4
が表示されます...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice
が、作業ディレクトリは代わりに%WinDir%\System32
フォルダ/ Start in:/のSC開始サービスから:1つの簡単な代替方法は、nssm.ccを使用することです。これにより、開始するディレクトリを指定するオプションが提供されます。