c#重新启动计算机后加载程序设置

c#重新启动计算机后加载程序设置,c#,wpf,autostart,C#,Wpf,Autostart,我在将设置加载到程序时遇到问题。系统重新启动后,程序会自动启动,但不会按应有的方式加载设置。但是,当我手动运行应用程序时,它会加载它们 用系统启动程序 RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); rkApp.SetValue("Monitor", BaseDir+"\\Monitor.exe"); 类负责加载设置 c

我在将设置加载到程序时遇到问题。系统重新启动后,程序会自动启动,但不会按应有的方式加载设置。但是,当我手动运行应用程序时,它会加载它们

用系统启动程序

RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("Monitor", BaseDir+"\\Monitor.exe");
类负责加载设置

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;
    }
}

为什么只有在重新启动应用程序后才加载设置?

如果系统运行应用程序时其工作目录与手动运行时的工作目录不同,则可能会出现此问题

要解决此问题,可以指定设置文件的绝对路径。 您可以通过替换以下行来执行此操作:

private const string DEFAULT_FILENAME = "settings.jsn";
与:

或:

如果需要更多帮助,请告诉我

您也可以使用评论中提到的其他建议来回答您的问题

更新

如果由于某种原因无法使用
Application.StartupPath
属性,还可以使用:

private static readonly string DEFAULT_FILENAME = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "settings.jsn");
我还没有注意到您在方法中使用此路径作为默认值。要使其正常工作,您可以尝试按照注释中Patrick的建议更改
WorkingDirectory
,或者使用null作为默认值,并在方法体中指定默认值,如下所示:

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;
    }
}

1.程序将随系统启动,但不会从文件中加载设置。2.关闭应用程序3。打开应用程序,设置已加载,不知道为什么第一步中没有加载。请尝试使用文件的绝对路径(例如
DEFAULT\u FILENAME=@“C:\myApplication\settings.jsn”
),而不是仅使用文件名。当系统运行应用程序时,可能工作目录有所不同,只是找不到文件。请告诉我这是否解决了您的问题。我尝试过这样做:
private const string DEFAULT\u FILENAME=basedir+“\\settings.json”
但获取一个错误
fileName'的默认参数值必须是编译时常量
若要验证这是否是问题的原因,只需硬编码整个路径以进行测试。要从另一个字符串使用基本目录,请将
const
替换为
readonly
关键字。如果进行此更改需要帮助,请告诉我。请尝试使用设置当前工作目录。我更改此
私有只读字符串DEFAULT\u FILENAME=BaseDir+“settings.jsn”它没有帮助在您的情况下什么是
BaseDir
?请看一下我在答案中输入的代码示例,它检测应用程序文件的位置并相应地调整路径。
public static string BaseDir=System.IO.path.GetDirectoryName(System.Reflection.Assembly.getExecutionGassembly().Location)
I suupose
Location
还包括文件名。请尝试
private static readonly string DEFAULT_FILENAME=Path.Combine(Application.StartupPath,“settings.jsn”)
如回答中所述。我尝试这样做,“fileName”的相同错误
默认参数值必须是编译时常量
使用:
私有静态只读字符串Default\u fileName=System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath,“settings.jsn”)
private static readonly string DEFAULT_FILENAME = Path.Combine(Application.StartupPath, "settings.jsn");
private static readonly string DEFAULT_FILENAME = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "settings.jsn");
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;
    }
}