J'obtiens un système.configuration.settingspropertyNotFoundException Erreur dans le service Windows

StackOverflow https://stackoverflow.com/questions/8404832

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?

Était-ce utile?

La solution

Cela signifie simplement que l'application ne peut pas lire le fichier .settings. Je peux penser à deux causes possibles:

  1. 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.

  2. 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);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top