2017-05-11 11 views
1

Visual Studioに実行可能ファイルを生成するプロジェクトがあります。私はその実行可能ファイルからWindowsサービスを作成しました。私はそれを実行するたびに、それが次のエラーで失敗します。Windowsサービスを実行しているときにFileNotFoundExceptionが発生する

Error 1053: The service did not respond to the start or control request in a timely fashion.

Windowsイベントビューアを見た後、私はプロジェクトの作業ディレクトリに配置されてFileNotFoundExceptionを得ていることが判明しました。これは、ファイルを開く部分です:

using (StreamReader file = File.OpenText("configSet.json")) 
{ 
    JsonSerializer serializer = new JsonSerializer(); 
    configSet = (ConfigSet)serializer.Deserialize(file, typeof(ConfigSet)); 
} 

これは、Visual Studioまたはコマンドプロンプトでサービスを実行すると完全に正常に動作します。私はWindowsサービスとして起動しようとすると何らかの理由でこれは動作しません。

私は、ファイルへのパスをハードコーディングすると、Windowsサービスとして起動するときにうまく動作することも分かりました。
これを避け、可能であれば相対パスを使用したいと思います(Visual Studio、コマンドプロンプト、またはWindowsサービスからサービスを実行しているかどうかを確認するコードチェックを行う必要はありません) 。

+0

jsonファイルはどこにありますか? –

+0

@ S.Petrosov私の生成されたプロジェクトフォルダのルートフォルダにあります。基本的には、私はVisual Studioでプロジェクトを持っています。私はデスクトップに必要なdll、フォルダなどを含むフォルダを作成しました。このフォルダには、サービスを作成する実行可能ファイルが含まれています。また、jsonファイルも含まれています。私はこのフォルダ全体をProgram Filesに移動します。その後、私はサービスを作成します:sc.exe create MY.SERVICE binpath = "C:¥Program Files¥myService¥myService.exe – Roka545

+1

ファイルは正しいパスにない可能性が最も高いです。実行可能ファイルがあります。http://stackoverflow.com/questions/884963/what-directory-does-a-windows-service-run-in – bgura

答えて

2

リフレクションを使用してカレントディレクトリを設定すると、実行可能ファイルのパスを取得できます。例を次に示します。

String path = System.Reflection.Assembly.GetExecutingAssembly().Location; 
path = System.IO.Path.GetDirectoryName(path); 
Directory.SetCurrentDirectory(path); 
+0

ありがとうございます! – Roka545

関連する問題