A volte si ha la necessita' di avere uno o piu' settings condivisi tra i gli utenti della propria applicazione, ad esempio la stringa di connessione al DB.
Questo e' facimente ottenibile associando a tali impostazioni un custom settings provider.

Esempio:
Ho esteso i settings creati da Visual Studio aggiungendo una partial class, cosi' ho il setting disponibile direttamente dall' Intellisense usando Properties.Settings.Default.CommonDBPath.

namespace TestSettings.Properties
{
 internal sealed partial class Settings
 {
  [ApplicationScopedSetting()]
  [DefaultSettingValue("C:\\")]
  [SettingsProvider(typeof(SharedSettingsFileProvider))]
  public string CommonDBPath
  {
   get { return (string)base["CommonDBPath"]; }
   set { base["CommonDBPath"] = value; }
  }
 }
}

Come potete notare, per questo setting ho specificato un custom provider SharedSettingsFileProvider che altro non e' che una classe che eredita da SettingsProvider.

class SharedSettingsFileProvider : SettingsProvider
 {
  private string mFileName;

  public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
  {
   base.Initialize(this.ApplicationName, config);
   mFileName = Path.Combine(Application.CommonAppDataPath, this.ApplicationName + ".config");
  }

  public override string ApplicationName
  {
   get { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; }
   set {  }
  }

  public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection)
  {
   SettingsPropertyValueCollection values = new SettingsPropertyValueCollection();

   XmlDocument doc = new XmlDocument();
   if(File.Exists(mFileName)) doc.Load(mFileName);

   foreach (SettingsProperty setting in collection)
            {
    SettingsPropertyValue value = new SettingsPropertyValue(setting);
    value.IsDirty = false;
    XmlNode node=doc.SelectSingleNode("/sharedSettings/" + setting.Name);
    value.SerializedValue = (node==null)? null: node.InnerText;
    values.Add(value);
   }
   return values;
  }

  public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
  {
   XmlDocument doc = new XmlDocument();
   XmlNode items=doc.AppendChild(doc.CreateElement("sharedSettings"));
   foreach (SettingsPropertyValue setting in collection)
   {
    if (!setting.UsingDefaultValue)
    {
     XmlNode node = doc.CreateNode(XmlNodeType.Element, null, setting.Name, null);
     node.InnerText=setting.SerializedValue.ToString(); 
     items.AppendChild(node);       
    }
   }
   doc.Save(mFileName);
  }
 }

La quale salva i settings decorati con l'attributo SettingsProvider in un file xml nella cartella "AllUsers" divenendo percio' condivisi.
Applicando l'attributo a livello di classe si ottiene che tutti i settings sono memorizzati attraverso questo provider.

Ovviamente il codice va preso “As is”... ;-)