代码之家  ›  专栏  ›  技术社区  ›  Ville Koskinen

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

  •  4
  • Ville Koskinen  · 技术社区  · 16 年前

    我一直在考虑修改 Doppler podcast aggregator 目的是能够直接从我的MP3播放器运行程序。

    Doppler使用生成的Visual Studio设计器存储应用程序设置 Settings class ,默认情况下,它将用户设置序列化到用户的主目录。我想更改此设置,以便将所有设置存储在与exe相同的目录中。

    似乎可以通过创建继承 SettingsProvider 班级。是否有人创建了这样的提供者并希望共享代码?

    更新: 我可以获得自定义设置提供程序 几乎 通过使用此 MSDN sample 即简单继承。最初,当Windows窗体设计器停止工作时,我很困惑,直到我执行了在 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 回复  |  直到 8 年前
        1
  •  14
  •   Ohad Schneider    16 年前

    为什么不按原样使用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;
    }
    
        2
  •  1
  •   alxnull    8 年前

    我知道这个问题已经很老了。我只想分享我自己版本的便携式设置提供商,我发布为nuget包。 here .

    使用非常简单:

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

    我还解释了在 https://www.codeproject.com/Articles/1238550/Making-Application-Settings-Portable .

        3
  •  0
  •   Ville Koskinen    16 年前

    只是为了“结束”这个问题:我最后得出的有点不满意的解决方案是

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

    缺点: 窗体设计器中断并给出一个异常,该异常基本上表示找不到自定义提供程序类。但生成的exe运行正常。按照问题中的描述在代码中设置提供程序会使设计器工作,但出于某种原因(我没有仔细观察过),设置不会序列化。

    似乎使设置便携化是使多普勒便携化所需要的。无论我是开始使用多普勒作为我的主要播客聚合器,还是继续使用我的自制命令行聚合器,我都会看到。