Diverse impostazioni dell’applicazione in base alla modalità di configurazione

Qualcuno è a conoscenza di un modo in cui posso impostare le impostazioni di livello dell’applicazione (o utente) in un’applicazione .Net che sono condizionate alla modalità di sviluppo corrente delle applicazioni? IE: Debug / Release

Per essere più specifici, ho un riferimento URL ai miei servizi Web contenuti nelle impostazioni dell’applicazione. Durante la modalità di rilascio desidero che tali impostazioni facciano riferimento a http://myWebservice.MyURL.com durante la modalità di debug. Mi piacerebbe che tali impostazioni fossero http://myDebuggableWebService.MyURL.com .

Qualche idea?

So che questo è stato chiesto anni fa, ma nel caso qualcuno stia cercando una soluzione semplice ed efficace che io uso.

  1. Vai alle proprietà del progetto, scheda Impostazioni (vedrai il tuo URL del servizio web o qualsiasi altra impostazione già elencata qui).

  2. Fai clic sul pulsante “Visualizza codice” disponibile nella pagina Impostazioni.

  3. Digitare questo nel costruttore.

    this.SettingsLoaded += Settings_SettingsLoaded; 
  4. Aggiungi la seguente funzione sotto il costruttore:

     void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e) { #if(DEBUG) this["YOUR_SETTING_NAME"] = VALUE_FOR_DEBUG_CONFIGURATION; #else this["YOUR_SETTING_NAME"] = VALUE_FOR_RELEASE_CONFIGURATION; #endif } 

Ora ogni volta che si esegue il progetto, verrà compilata solo la riga che corrisponde alla configurazione di generazione corrente.

Questo è un po ‘tardi per il partito, ma mi sono imbattuto in un buon modo di implementare l’approccio app.config per i file app.config . (cioè usa lo spazio dei nomi http://schemas.microsoft.com/XML-Document-Transform )

Penso che sia “bello” perché è un approccio puramente xml e non richiede software di terze parti.

  • Un file App.config padre / predefinito discende, in base alle varie configurazioni di build.
  • Questi discendenti quindi ignorano solo ciò di cui hanno bisogno.

A mio avviso questo è molto più sofisticato e robusto del dover mantenere il numero x di file di configurazione che vengono copiati nella loro interezza, come in altre risposte.

Una procedura dettagliata è stata pubblicata qui: http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


Guarda, mamma – Nessun evento esplicito post-compilazione nel mio IDE!

Per quanto ne so, non esiste un modo per farlo. Nel nostro progetto manteniamo 4 diversi file di impostazioni, e li commutiamo copiandoli ciascuno nel file attivo nella fase di pre-build del build.

 copy "$(ProjectDir)properties\settings.settings.$(ConfigurationName).xml" "$(ProjectDir)properties\settings.settings" copy "$(ProjectDir)properties\settings.designer.$(ConfigurationName).cs" "$(ProjectDir)properties\settings.Designer.cs" 

Questo ha funzionato in modo impeccabile per noi per alcuni anni. Basta cambiare la destinazione e anche l’intero file di configurazione viene cambiato.

Modifica: i file sono denominati ad esempio settings.settings.Debug.xml , settings.settings.Release.xm l ecc.

Scott Hanselman ha descritto un approccio un po ‘più intelligente, l’unica differenza è che non abbiamo il controllo per vedere se il file è cambiato: http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

Se si desidera conservare tutto in un file di configurazione, è ansible introdurre una sezione di configurazione personalizzata su app.settings per memorizzare le proprietà per le modalità di debug e di rilascio.

È ansible mantenere l’object nell’app che memorizza le impostazioni specifiche della modalità dev o sovrascrivere un’app di gioco esistente in base all’interruttore di debug.

Ecco un breve esempio di app per console (DevModeDependencyTest):

App.config:

 < ?xml version="1.0" encoding="utf-8"?>    

L’object per memorizzare la configurazione personalizzata (DevModeSettings.cs):

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace DevModeDependencyTest { public class DevModeSetting : ConfigurationSection { public override bool IsReadOnly() { return false; } [ConfigurationProperty("webServiceUrl", IsRequired = false)] public string WebServiceUrl { get { return (string)this["webServiceUrl"]; } set { this["webServiceUrl"] = value; } } } } 

Un gestore per accedere alle impostazioni di configurazione personalizzate (DevModeSettingsHandler.cs):

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace DevModeDependencyTest { public class DevModeSettingsHandler { public static DevModeSetting GetDevModeSetting() { return GetDevModeSetting("debug"); } public static DevModeSetting GetDevModeSetting(string devMode) { string section = "DevModeSettings/" + devMode; ConfigurationManager.RefreshSection(section); // This must be done to flush out previous overrides DevModeSetting config = (DevModeSetting)ConfigurationManager.GetSection(section); if (config != null) { // Perform validation etc... } else { throw new ConfigurationErrorsException("oops!"); } return config; } } } 

Infine, il punto di accesso all’app della console (DevModeDependencyTest.cs):

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace DevModeDependencyTest { class DevModeDependencyTest { static void Main(string[] args) { DevModeSetting devMode = new DevModeSetting(); #if (DEBUG) devMode = DevModeSettingsHandler.GetDevModeSetting("debug"); ConfigurationManager.AppSettings["webServiceUrl"] = devMode.WebServiceUrl; #endif Console.WriteLine(ConfigurationManager.AppSettings["webServiceUrl"]); Console.ReadLine(); } } } 

SlowCheetah aggiunge la funzionalità richiesta non solo per App.config ma per qualsiasi file XML nel tuo progetto – http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

Ho avuto un problema simile a risolvere e ho finito per utilizzare il motore di trasformazione XDT (web.config), che era già stato suggerito nella risposta da ne1410s che può essere trovata qui: https://stackoverflow.com/a/27546685/410906

Ma invece di farlo manualmente come descritto nel suo link ho usato questo plugin: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

Il plugin aiuta solo a configurare la configurazione, non è necessario creare e la soluzione può essere costruita su altre macchine o su un server di build senza il plug-in o altri strumenti richiesti.