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

时间:2009-09-05 06:15:09

标签: c# .net settings portability

我一直在寻找修改Doppler podcast aggregator的来源,目标是能够直接从我的mp3播放器运行程序。

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

通过创建继承SettingsProvider类的自定义提供程序类,似乎可以实现这一点。有没有人创建过这样的提供商并希望共享代码?

更新:我可以使用此MSDN sample,即使用简单的继承,使自定义设置提供程序几乎正常工作。我最初感到困惑,因为Windows Forms设计器停止工作,直到我在Codeproject建议这个技巧:

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

    public Settings()
    {
        foreach (SettingsProperty property in this.Properties)
        {
            property.Provider = settingsprovider;
        }
    ...

程序仍以窗口大小0; 0开始。

对此有任何见解的人?

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

3 个答案:

答案 0 :(得分:14)

为什么不按原样使用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();
    }

最后,我对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;
}

答案 1 :(得分:1)

我知道这个问题已经很老了。我只是想分享我自己版本的便携式设置提供程序,我将其作为nuget package here发布。

用法非常简单:

// make the default settings class portable
PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);

我还在https://www.codeproject.com/Articles/1238550/Making-Application-Settings-Portable解释了此实施的基本策略。

答案 2 :(得分:0)

只是为了“关闭”这个问题:我最终得到的一些令人不满意的解决方案是

  1. 创建自定义设置提供程序,该提供程序继承自SettingsProvider并将设置存储在XML文件中
  2. 使用设计器
  3. 将每个设置的Provider属性(通过在设计器中选择整个网格)设置为自定义设置提供程序

    缺点:表单设计器中断并提供异常,基本上说无法找到自定义提供程序类。然而,构建的exe工作正常。在问题中描述的代码中设置提供程序使设计器工作,但由于某些原因,我没有仔细查看,设置将不会序列化。

    似乎只需要设置便携设置就可以使多普勒便携。我是否会开始使用多普勒作为我的主播客聚合器或坚持使用我的自制命令行聚合器,我会看到。