Frage

Ich habe eine Windows-App, die SettingsProvider zum Lesen der Konfigurationseinstellungen verwendet und Standardwerte festlegt, wenn keine Datei vorhanden ist.

Es funktioniert einwandfrei.

Ich versuche, einen Windows-Dienst zu schreiben, der diese App startet.Wenn es vom Dienst ausgeführt wird, erhalte ich System.Configuration.SettingsPropertyNotFoundException für alle Einstellungsattribute.

Wie kann ich diese Ausnahme beheben, wenn der Dienst die App ausführt?

War es hilfreich?

Lösung

Dies bedeutet einfach, dass die App die .Settings-Datei nicht lesen kann.Ich kann mir zwei mögliche Ursachen vorstellen:

  1. Der Dienst wird unter einem Konto ausgeführt, das keinen Zugriff auf die Einstellungsdatei hat.(oder .config-Datei, abhängig) Dies ist unwahrscheinlich, da der Dienst die App starten kann und es nicht sinnvoll wäre, Berechtigungen für die App und nicht für die Einstellungsdatei zu haben.

  2. Die Laufzeit kann die Einstellungsdatei nicht finden .Es wird erwartet, dass sich die Einstellungen im Stammstartpfad der ausführbaren Datei befinden.Stellen Sie sicher, dass es auf dem betreffenden Computer vorhanden ist.

    Ein Google-Ergebnis stellte jedoch eine offensichtliche mögliche Ursache dar, an die ich nicht gedacht habe.Wurden die Einstellungen nach der letzten Kompilierung hinzugefügt?Kompilieren Sie die App in Visual Studio und versuchen Sie es erneut ...

Andere Tipps

Eine weitere mögliche Ursache ist, dass Sie einen benutzerdefinierten SettingsProvider schreiben, der während des Initializes ausgelöst wird und eine Ausnahme darstellt.

In meinem Fall hatte ich Folgendes getan:

public class CustomSettingsProvider : SettingsProvider
{
    public override void Initialize(string name, NameValueCollection config)
    {
        base.Initialize(name, config);
    }
}

Da name immer als null übergeben wird, hat base.Initialize einen ArgumentNullException ausgelöst.Ich habe es behoben, indem ich einen Namen ungleich Null wie folgt übergeben habe:

    public override void Initialize(string name, NameValueCollection config)
    {
        base.Initialize(name ?? GetType().Name, config);
    }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top