J'obtiens un système.configuration.settingspropertyNotFoundException Erreur dans le service Windows
-
28-10-2019 - |
Question
J'ai une application Windows qui utilise SettingsProvider pour lire les paramètres de configuration et définit les valeurs par défaut si le fichier n'existe pas.
Cela fonctionne bien en cours d'exécution normalement.
J'essaie d'écrire un service Windows qui démarre cette application. Quand il est géré par le service, je reçois System.Configuration.SettingsPropertyNotFoundException
sur tous les attributs de réglage.
Comment puis-je résoudre cette exception lorsque le service exécute l'application?
La solution
Cela signifie simplement que l'application ne peut pas lire le fichier .settings. Je peux penser à deux causes possibles:
Le service s'exécute sous un compte qui n'a pas accès au fichier .settings. (ou .Config Fichier, selon) Cela est peu probable car le service peut démarrer l'application, et il n'aurait pas de sens qu'il ait des autorisations à l'application et non au fichier de paramètres.
Le temps d'exécution ne peut pas trouver le fichier de paramètres. Il s'attend à ce que les paramètres soient dans le chemin de démarrage racine de l'exécutable. Vérifiez pour vous assurer qu'il existe sur la machine en question.
Cependant, un résultat Google a révélé une cause possible à laquelle je n'ai pas pensé. Les .Settings ont-ils été ajoutés après la dernière compilation? Compilez l'application dans Visual Studio, et réessayez ...
Autres conseils
Une autre cause possible est si vous écrivez une coutume SettingsProvider
C'est lancer et exception pendant Initialize
.
Dans mon cas, j'avais fait ceci:
public class CustomSettingsProvider : SettingsProvider
{
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name, config);
}
}
Depuis name
est toujours passé comme null
, base.Initialize
Jetait un ArgumentNullException
. Je l'ai corrigé en passant un nom non nulle comme ceci:
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name ?? GetType().Name, config);
}