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

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

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

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

更新:我能够通过使用此MSDN示例 (即具有简单inheritance)使自定义设置提供程序几乎正常工作。 我最初感到困惑,因为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建议的属性?
  • 为什么使用默认设置提供程序与自定义提供程序将默认设置传递给应用程序的方式有何变化?

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

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

用法非常简单:

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

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

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

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

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

看起来设置便携是制作多普勒便携式所需的全部内容。 我是否会开始使用Doppler作为我的主播客聚合器或坚持使用我的自制命令行聚合器,我会看到。