2017-05-11 4 views
1

J'ai un projet dans Visual Studio qui génère un exécutable. J'ai créé un service Windows à partir de cet exécutable. Chaque fois que je le lance, il échoue avec l'erreur suivante:FileNotFoundException lors de l'exécution d'un service Windows

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

Après avoir regardé Observateur d'événements Windows, j'ai découvert que je reçois un FileNotFoundException qui est situé dans le répertoire de travail du projet. Ceci est la partie qui ouvre le fichier:

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

Cela fonctionne parfaitement bien quand je lance le service dans Visual Studio ou à partir de l'invite de commande. Pour une raison quelconque, cela ne fonctionne pas lorsque j'essaie de le démarrer en tant que service Windows.

J'ai également découvert que coder en dur le chemin d'accès au fichier fonctionne correctement lors du démarrage en tant que service Windows. Je souhaite éviter cela et utiliser le chemin relatif si possible (donc je n'ai pas besoin d'effectuer une vérification de code pour déterminer si j'exécute le service depuis Visual Studio, une invite de commande ou un service Windows) .

+0

Où est votre fichier json? –

+0

@ S.Petrosov Dans le dossier racine de mon dossier de projet généré. Fondamentalement, j'ai un projet dans Visual Studio. Je l'ai publié sur mon bureau, ce qui donne un dossier avec les DLL, les dossiers, etc. requis. Ce dossier inclut l'exécutable dont je crée le service. Il contient également le fichier json. Je prends tout ce dossier et le déplace vers Program Files. Après cela, je crée le service via: sc.exe créer MY.SERVICE binpath = "C: \ Program Files \ monService \ myService.exe – Roka545

+1

Le fichier ne se trouve probablement pas dans le chemin correct. exécutable est situé http://stackoverflow.com/questions/884963/what-directory-does-a-windows-service-run-in – bgura

Répondre

2

Vous pouvez obtenir le chemin de l'exécutable en utilisant la réflexion et lui définir le répertoire courant. Voici un exemple comment le faire:

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

Merci - ça marche! – Roka545