2015-07-15 2 views
1

J'ai un problème avec le chargement des paramètres dans mon programme. Après un redémarrage du système, le programme démarre automatiquement, mais ne charge pas les paramètres comme il se doit. Il les charge cependant quand j'exécute l'application manuellement.C# charger les paramètres du programme après le redémarrage de l'ordinateur

Démarrage du programme avec le système

RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 
rkApp.SetValue("Monitor", BaseDir+"\\Monitor.exe"); 

classe responsable des paramètres de chargement

class MySettings : AppSettings<MySettings> 
{ 
    public string filePath = null; 
    public string interval = "0"; 
} 
public class AppSettings<T> where T : new() 
{ 
    private const string DEFAULT_FILENAME = "settings.jsn"; 

    public void Save(string fileName = DEFAULT_FILENAME) 
    { 
     File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this)); 
    } 

    public static void Save(T pSettings, string fileName = DEFAULT_FILENAME) 
    { 
     File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings)); 
    } 

    public static T Load(string fileName = DEFAULT_FILENAME) 
    { 
     T t = new T(); 
     if (File.Exists(fileName)) 
      t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName)); 
     return t; 
    } 
} 

J'utilise le code suivant pour charger mes paramètres

MySettings settings = MySettings.Load(); 
string inter = settings.interval; 

Pourquoi la les paramètres ne sont chargés qu'après le redémarrage de l'application?

+0

1. Le programme commencera avec le système, ne charge pas les paramètres du fichier. 2. Désactiver les applications 3. Activer les applications, les paramètres sont chargés, ne sais pas pourquoi dans la première étape ne se charge pas. – lukassz

+0

Essayez d'utiliser le chemin absolu vers le fichier (par exemple 'DEFAULT_FILENAME = @" C: \ myApplication \ settings.jsn "') au lieu d'utiliser uniquement un nom de fichier. Peut-être qu'un répertoire de travail diffère lorsque l'application est exécutée par le système et que le fichier est introuvable. S'il vous plaît laissez-moi savoir si cela résout votre problème. –

+0

J'ai essayé de le faire: 'private const chaîne DEFAULT_FILENAME = basedir +" \\ settings.json ";' mais obtient une erreur 'La valeur par défaut du paramètre 'fileName' doit être une constante de compilation'' – lukassz

Répondre

2

Le problème peut se produire si le répertoire de travail de l'application est différent lorsqu'il est exécuté par le système que si vous l'exécutez manuellement.

Pour résoudre ce problème, vous pouvez spécifier le chemin absolu du fichier de paramètres. Vous pouvez le faire en remplaçant la ligne:

private const string DEFAULT_FILENAME = "settings.jsn"; 

avec:

private const string DEFAULT_FILENAME = @"C:\MyApplicationFolder\settings.jsn"; 

ou:

private static readonly string DEFAULT_FILENAME = Path.Combine(Application.StartupPath, "settings.jsn"); 

S'il vous plaît laissez-moi savoir si besoin d'aide à ce sujet.

Vous pouvez également utiliser d'autres suggestions mentionnées dans les commentaires pour votre question.

MISE À JOUR

Si vous ne pouvez pas utiliser Application.StartupPath propriété pour une raison quelconque, vous pouvez également utiliser:

private static readonly string DEFAULT_FILENAME = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "settings.jsn"); 

J'ai pas remarqué que vous utilisez ce chemin comme valeur par défaut dans vos méthodes. Pour le faire fonctionner, vous pouvez essayer de changer WorkingDirectory comme suggéré par Patrick dans les commentaires ou tout simplement utiliser null par défaut et attribuer une valeur par défaut dans le corps de la méthode comme ceci:

public void Save(string fileName = null) 
{ 
    AssignDefaultSettingsFilePathIfEmpty(ref fileName); 

    File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this)); 
} 

private void AssignDefaultSettingsFilePathIfEmpty(ref string fileName) 
{ 
    if (string.IsNullOrEmpty(fileName)) 
    { 
     fileName = DEFAULT_FILENAME; 
    } 
} 
+0

Je change cette 'readonly chaîne privée DEFAULT_FILENAME = BaseDir +" settings.jsn ";' Cela n'a pas aidé – lukassz

+0

Qu'est-ce que 'BaseDir' dans votre cas? S'il vous plaît jeter un oeil à l'échantillon de code que j'ai mis dans la réponse qui détecte où se trouve le fichier d'application et ajuste le chemin en conséquence. –

+0

'Chaîne statique publique BaseDir = System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly(). Emplacement);' – lukassz