如何使设计器生成的.Net应用程序设置可移植

Vil*_*nen 5 .net c# settings portability

我一直在寻找修改多普勒播客聚合器的来源,目标是能够直接从我的MP3播放器运行程序.

多普勒使用Visual Studio设计器生成的Settings类存储应用程序设置,该类默认将用户设置序列化到用户的主目录.我想改变它,以便所有设置都存储在与exe相同的目录中.

看来这可以通过创建继承SettingsProvider类的自定义提供程序类来实现.有没有人创建过这样的提供商并希望共享代码?

更新:通过使用此MSDN示例,即使用简单的继承,我能够使自定义设置提供程序几乎正常工作.我最初感到困惑,因为Windows Forms设计器停止工作,直到我在Codeproject上做了这个技巧:

internal sealed partial class Settings
{
    private MySettingsProvider settingsprovider = new MySettingsProvider();

    public Settings()
    {
        foreach (SettingsProperty property in this.Properties)
        {
            property.Provider = settingsprovider;
        }
    ...
Run Code Online (Sandbox Code Playgroud)

该程序仍然以窗口大小0; 0开始.

有任何见解的人吗?

  • 为什么需要在运行时协助提供程序 - 而不是使用MSDN建议的属性?
  • 为什么使用默认设置提供程序和自定义提供程序将默认设置传递给应用程序的方式有何变化?

Oha*_*der 15

为什么不按原样使用CodeProject PortableSettingsProvider解决方案(稍作修改)?我已经在我的项目(StreamRecorder.NET)中成功完成了这项工作.

关于项目页面的一些评论很有用:

我最终得到的代码:

    static void Main(string[] args)
    {
        if (args.Contains("-p") || args.Contains("--portable"))
        {
            MakePortable(Properties.Settings.Default);
            MakePortable(Properties.LastUsedSettings.Default);
            MakePortable(Properties.DefaultSettings.Default);
        }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm(args));
    }

    private static void MakePortable(ApplicationSettingsBase settings)
    {
        var portableSettingsProvider = 
            new PortableSettingsProvider(settings.GetType().Name + ".settings");
        settings.Providers.Add(portableSettingsProvider);
        foreach (System.Configuration.SettingsProperty prop in settings.Properties)
            prop.Provider = portableSettingsProvider;
        settings.Reload();
    }
Run Code Online (Sandbox Code Playgroud)

最后,我对CP项目进行了以下更改:

string _fileName;
public PortableSettingsProvider(string fileName)
{
    _fileName = fileName;
}

public virtual string GetAppSettingsFilename()
{
    //Used to determine the filename to store the settings
    //return ApplicationName + ".settings";
    return _fileName;
}
Run Code Online (Sandbox Code Playgroud)