2012-03-15 17 views
6

ho bisogno di un file di configurazione comune condiviso da tre applicazioniapp.config comune tra le applicazioni

ho risolto con l'aggiunta in un file in appsettings

<appSettings file="ait.config"> 
    <!--<add key="Culture" value="zh-CN" />--> 
    <add key="Culture" value=""/> 
    <add key="ClientSettingsProvider.ServiceUri" value=""/> 
</appSettings> 

Nel ait.config posso conservare alcuni valori comuni come

<?xml version="1.0" encoding="utf-8" ?> 
<appSettings> 
    <add key="Username" value="Klabberius" /> 
</appSettings> 

se provo a leggerla come

string stvalue = ConfigurationManager.AppSettings["Username"]; 

Funziona bene, ma se provo a scrivere un valore come

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

config.AppSettings.Settings["Username"].Value = userName; 
config.Save(ConfigurationSaveMode.Modified); 
ConfigurationManager.RefreshSection("appSettings"); 

Invece di scrivere al file comune ait.config si aggiunge il nome utente chiave del app.config standard ogni applicazione separata, chiunque sa come risolvere questo.

+0

un file di configurazione si trova nella cartella del programma non è il luogo ideale per memorizzare le impostazioni definite dall'utente. (I tuoi utenti non dovrebbero essere in grado di scrivere in C: \ Programmi \ YourApp \ ... in primo luogo.) – Heinzi

risposta

1

Con il vostro metodo, si modifica la configurazione corrente, non il file che si voglio, perché questo è il documento che hai aperto. Sfortunatamente, la configurazione condivisa sembra non essere "accettata" come file di configurazione perché manca il nodo di configurazione. È possibile aprire la configurazione condivisa come un documento "normale" xml da config (dopo il codice di linea 1):

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(config.AppSettings.File); 

allora si dovrebbe solo cambiare il doc. Peccato per me Non sono bravo in linq per xml, il sotto funziona, ma probabilmente c'è un modo più semplice.

XmlNode n = xmlDoc.SelectSingleNode("//appSettings"); 
XmlNode x = n.ChildNodes[0]; 
x.Attributes[1].Value = userName; 
xmlDoc.Save(config.AppSettings.File); 
+0

Grazie, ho finito per risolverlo in un altro modo, creando un file di configurazione condiviso che non è collegato in app .config ma la soluzione potrebbe funzionare anche – klashagelqvist

0

Credo che il percorso dei file delle impostazioni dell'app sia predefinito su app.config. potrebbe essere rinfrescante potrebbe aiutare. havent testato questo, ma per favore provate questo - aggiungere questa riga di codice dopo aver inizializzato config e prima di chiamare salvare

config.AppSettings.File = config.FilePath; 

HTH

0

L'approccio standard per dividere le impostazioni per separare i file è quello di utilizzare il ConfigSource of ConfigurationSection. Pertanto, se si desidera mantenere TUTTI dei tuoi AppSettings in "ait.config", si potrebbe fare in questo modo:

<appSettings configSource="ait.config" /> 

Si noti, tuttavia, questo funziona solo se si tengono TUTTI tuoi AppSettings in un file separato. Se si tenta di mantenere alcune delle impostazioni nel file di configurazione principale applicazione come:

<appSettings configSource="ait.config"> 
    <add key="Culture" value=""/> 
    <add key="ClientSettingsProvider.ServiceUri" value=""/> 
</appSettings> 

Si ottiene un'eccezione dicendo qualcosa come "Le sezioni devono comparire solo una volta per file di configurazione.".

probabilmente si dovrebbe utilizzare una "Sezione Configurazione personalizzata" per le configurazioni condivise, provare:

  1. Create Custom Configuration Sections Using ConfigurationSection.
  2. Puntare il configSource della vostra personalizzato Sezione Configurazione al file contenente configurazioni comuni.

Ecco un semplice esempio per iniziare:

Definisci la tua sezione personalizzata:

public class CommonConfSection : ConfigurationSection 
{ 
    private const String UserNameProperty = "Username"; 
    [ConfigurationProperty(UserNameProperty, DefaultValue = "__UNKNOWN_NAME__", IsRequired = false)] 
    public String UserName 
    { 
     get { return (String)this[UserNameProperty]; } 
     set { this[UserNameProperty] = value; } 
    } 
} 

App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="CommonSettings" 
     type="[Your Assembly Name].CommonConfSection, [Your Assembly Name]" 
     /> 
    </configSections> 

    <appSettings> 
    <add key="Culture" value=""/> 
    <add key="ClientSettingsProvider.ServiceUri" value=""/> 
    </appSettings> 

    <CommonSettings configSource="common.config" /> 
</configuration> 

Nota:

  1. configSections DEVE essere il primo nodo figlio della configurazione ;
  2. I CommonSettings sezione: configSource = "common.config" dice le impostazioni per questa sezione vengono memorizzati nel file denominato "common.config" (nella stessa cartella).

E qui è ciò che common.config assomiglia:

<?xml version="1.0" encoding="utf-8" ?> 
<CommonSettings Username="testUser" /> 
Problemi correlati