2011-02-08 10 views
14

Sto scrivendo un server di gioco in C# e vorrei ricaricare o aggiornare le impostazioni da un file di configurazione mentre il server è in esecuzione.Ricarica le impostazioni di configurazione da un file di configurazione esterno durante l'esecuzione

Idealmente vorrei salvare le impostazioni in un file XML, hanno la possibilità di modificare il file mentre il server di gioco è in esecuzione e quindi inviare al server il comando per ricaricare le impostazioni dal file.

So che posso usare un database anche per fare questo, ma il server di gioco è piuttosto piccolo e penso che sarebbe più pratico salvare le impostazioni in un file flat. Avrò l'accesso a livello di file alla macchina su cui verrà eseguito il server.

Che cosa dovrei usare?

+0

Questa domanda sembra piuttosto soggettiva. – Amy

+3

È possibile configurarlo in modo che il server carichi automaticamente le impostazioni del file con 'System.IO.FileSystemWatcher'. Se si utilizza una classe 'Impostazioni' personalizzata, è possibile semplicemente bloccare la classe, ricaricarla da un file, sbloccarla (se si utilizzano più thread). Leggere/scrivere da/su file o serializzazione è così banale in .NET che probabilmente non è quello con cui hai bisogno di aiuto. –

+0

Ho anche usato FileSystemWatcher in passato. È veloce, facile e fa il lavoro. –

risposta

13

Utilizzare http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

Utilizzare una sezione di configurazione personalizzata, collegare le sezioni da app.config a file di configurazione esterni impostando l'attribuzione della posizione della sezione. Tutto carico xml e la serializzazione è fatto da quelle classi personalizzate

codice fornito da CarelZA:

Prima di tutto, ConfigurationManager memorizza nella cache la configurazione delle applicazioni, attraverso la sezione di configurazione, ed è possibile chiamare ConfigurationManager.RefreshSection() per invalidare la cache per una sezione specifica.

In app.config ho aggiunto:

<configSections> 
    <section name="gameSettings" 
      type="System.Configuration.NameValueSectionHandler,system , Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/> 
</configSections> 
<gameSettings configSource="game.config"/> 

ho creato un file chiamato "game.config" e impostare "Copia Output Directory" a "Copy sempre".

In game.config:

<gameSettings> 
    <add key="SettingName" value="SettingValue" /> 
</gameSettings> 

Poi nel codice, al fine di accedere a qualsiasi ambiente:

settings = (NameValueCollection) ConfigurationManager.GetSection("gameSettings"); 
return settings["SettingName"]; 

E per ricaricare il config gioco in qualsiasi momento in cui il comando reload viene inviato al server:

ConfigurationManager.RefreshSection("gameSettings"); 
0

Sembra un lavoro per la serializzazione XML! Invece di analizzare e modificare manualmente XML, è possibile ottenere facilmente lo stesso effetto creando un oggetto impostazioni, serializzandolo in XML e de/serializzandolo quando è necessario apportare modifiche. In questo modo, è possibile scambiare i file di configurazione a caldo.

using System.Xml.Serialization;

Per esempio, si potrebbe avere l'oggetto

public class Settings 
{ 
    public string SomeProperty {get; set;} 
    public string SomeProperty2 {get; set;} 
} 

salvarlo sul disco come,

var settings = new Settings {SomeProperty="Hello", SomeProperty2="Joe"}; 
var fs = new FileStream("settings.xml"); 
var xs = new XmlSerializer(settings.GetType()); 
xs.Serialize(fs,settings); 

leggere di nuovo come,

var fs = new FileStream("settings.xml"); 
var settings = (Settings)fs.Deserialize(fs); 
+0

Controlla la risposta di Rene. ConfigurationManager esiste già per questo scopo e ho capito come usarlo per fare ciò di cui ho bisogno. Non c'è bisogno di leggere e analizzare personalmente i file XML. – CarelZA

0

Scopri i MemoryCache in System.Runtime.Caching (NET 4.0).Si potrebbe scrivere da soli una semplice classe che esegue le seguenti operazioni:

  • caricare il file XML
  • Analizzare il contenuto in qualunque rappresentazione li vuoi in
  • Conservare l'uscita nella cache con una HostFileChangeMonitor guardarlo - questo verrà rimosso automaticamente dalla cache quando il file viene modificato

Prima di eseguire una delle operazioni precedenti, è necessario controllare la cache per verificare se esiste una copia precedentemente memorizzata delle impostazioni e solo procedi se succede sn't.

Il vantaggio di far ruotare il proprio approccio in questo modo è che non si avvia il riavvio dell'applicazione, come nel caso di AppSettings memorizzate nei file web.config o app.config. (Va detto che questo non è l'unico modo per raggiungere questo)

+0

sai che HostFileChangeMonitor è nuovo con .NET 4, giusto? –

+0

Sì, lo faccio notare nella risposta :) –

+0

Controlla la risposta di Rene. ConfigurationManager esiste già per questo scopo e ho capito come usarlo per fare ciò di cui ho bisogno. Non c'è bisogno di leggere e analizzare personalmente i file XML. Inoltre, ConfigurationManager memorizza nella cache per sezione, quindi fa tutto per me. – CarelZA

4

Secondo la richiesta postare il mio commento come risposta:

È possibile impostarlo in modo che il server automaticamente carica le impostazioni del file con FileSystemWatcher . Se si utilizza una classe personalizzata Settings, è possibile semplicemente bloccare la classe, ricaricarla da un file e sbloccarla (se si utilizzano più thread).

Leggere/scrivere da/su file o serializzazione è così banale in .NET che probabilmente non è quello che ti serve aiuto e ci sono molte opzioni su come farlo.

+0

La tua risposta mi dice come controllare un file di configurazione che cambia ma non quello che dovrei usare per gestire il file di configurazione. Inoltre, ho specificato che userò un comando per ricaricare il file di configurazione, non deve avvenire automaticamente. Ma è informativo, grazie comunque. – CarelZA

Problemi correlati