2013-04-30 19 views
8

Ho bisogno di alcune impostazioni di un'applicazione che verrà condivisa tra tutti gli utenti del computer, ma potrebbe anche essere modificata in fase di esecuzione. La cucitura è semplice, ma secondo lo Application Settings MSDN article, è l'uno o l'altro.Come ottenere una Impostazioni applicazione condivisa per tutti gli utenti che potrebbero essere modificati in fase di esecuzione

Ci sono due tipi di impostazioni delle applicazioni, sulla base di portata:

  • Impostazioni dell'applicazione con ambito possono essere utilizzati per le informazioni come ad esempio un URL per un servizio Web o di una stringa di connessione al database. Questi valori sono associati all'applicazione. Pertanto, gli utenti non possono modificarli in fase di esecuzione.

  • Le impostazioni con ambito utente possono essere utilizzate per informazioni quali la persistenza dell'ultima posizione di un modulo o una preferenza di carattere. Gli utenti possono modificare questi valori in fase di esecuzione.

ho potuto scrivere il codice per modificare il file XML app.config, ma dato che si trova nella directory del programma, è protetta sotto Windows 7. Quindi questo non è possibile senza elevare il programma o giocare con NTFS diritti.

Quindi ho bisogno che il file di configurazione sia scritto in una cartella comune come System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData).

Ma questo è un requisito abbastanza comune!

Quindi, mi chiedo se c'è un modo semplice per raggiungere questo senza reinventare la ruota, o se devo scrivere il mio Setting Manager.

risposta

4

Ho avuto un problema simile e ho finito per scrivere la mia classe di impostazioni. Era molto semplice. Ho creato una classe Settings con le proprietà di cui avevo bisogno e un SettingsManager con i metodi Save() e Load() che semplicemente serializzavano/deserializzavano l'oggetto tramite XmlSerializer in/da un file.

Sì, è il tuo codice, ma è un codice molto semplice, richiede meno tempo rispetto a cercare di capire se c'è un componente che fornisce ciò che ti serve e come personalizzarlo.

+0

Puoi condividere il tuo codice? –

+0

Vedere un esempio qui su come eseguire questa operazione: https://msdn.microsoft.com/en-gb/library/ms973902.aspx#persistappsettnet_creatingcustomclass – Simon

1

L'infrastruttura Impostazioni applicazione non supporta questo: sono supportati solo dati dell'applicazione non modificabili e dati con ambito utente. È tuttavia possibile leggere e scrivere il proprio codice XML nelle cartelle CommonApplicationData, invece di utilizzare i dati dell'applicazione.

+0

Ha senso sostituire "dati" con "Impostazioni", ma potresti espandere l'ultima frase?Fondamentalmente intendo che ho bisogno di scrivere il mio * Setting Manager *, assicurandomi di aver creato una cartella per conservare il file di configurazione in "CommonApplicationData" e scrivere/leggere XML su di esso. Non c'è classe che potrei facilmente ereditare o interfaccia che potrei implementare per ottenere quel risultato? – DavRob60

+0

@ DavRob60 No: non esiste un "Gestore impostazioni" incorporato che gestisca, sfortunatamente. Si potrebbe semplicemente usare XDocument (http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx) e simili per rendere semplice la lettura/scrittura da XML. –

+0

Che dire della [SettingsProvider Class] (http://msdn.microsoft.com/en-us/library/system.configuration.settingsprovider%28v=vs.100%29.aspx)? C'è qualcosa da costruire intorno a questo, è qualcosa di completamente diverso o non è la seccatura a cercare di fare confusione con quello? – DavRob60

2

Dopo aver letto le risposte qui e giocare con i metodi ConfigurationManager.Open ho finito con il seguente:

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyApp", "MyApp.config"); 
Configuration MyAppConfig = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = path }, ConfigurationUserLevel.None); 

La parte bella è il file non deve esistere, e se si chiama Save() su di esso, creerà la cartella e il file per te. AppSettings["key"] non ha funzionato anche se così ho dovuto usare

MyAppConfig.AppSettings.Settings["key"].Value 

a leggere e scrivere un valore esistente e

MyAppConfig.AppSettings.Settings.Add("key", value) 

per aggiungere un nuovo valore.