2011-01-03 1 views
27

Sto creando un'app console in Visual Studio 2010 con C#. Voglio che questa app sia indipendente, in quanto tutto ciò di cui hai bisogno è l'exe e puoi eseguirlo da qualsiasi luogo. Voglio anche usare app.config per archiviare le stringhe di connessione e così via.Come si compila App.config nel mio exe in un'app console C# VS2010?

Il mio problema è che non riesco a capire come includere i dati di app.config nel file exe compilato. Vedo che crea appnamename.config, ma non voglio che le persone debbano preoccuparsi di prendere due file separati quando ottengono l'app.

Nessuno dei googling che ho fatto ha inventato nulla. È possibile?

+0

AFAIK non è possibile includere il file di configurazione nell'exe.Se la configurazione è semplice, puoi semplicemente archiviarla in un tuo file e crearla alla prima esecuzione con le impostazioni predefinite. Un'altra opzione è anche il registro di Windows, ma poi, è necessario eseguire elevato in Vista o superiore (che di per sé non è difficile) – gideon

+2

possibile duplicato di [File di configurazione come risorsa incorporata] (http://stackoverflow.com/questions/462583/configuration-file-as-embedded-resource) –

+1

Pensaci un po '. Se fosse possibile, il tuo utente non potrebbe più cambiare la stringa di connessione. Sconfiggere il punto di averne uno. Un singolo file non è mai un problema, si chiama setup.exe –

risposta

13

Non è possibile. La metà di questi file di configurazione è consentire modifiche alla configurazione dell'app al di fuori dell'app stessa.

Dovresti semplicemente modificare il tuo programma in modo che non abbia una dipendenza dal file di configurazione dell'app - il modo più semplice per farlo sarebbe quello di incollare i valori all'interno della tua configurazione in variabili globali di sola lettura.

+0

Credo di aver perso il punto dei file di configurazione. Dovrò impostarli. – Patches

+8

Mentre +1, il problema è quando uno strumento mette qualcosa in app.config, non tu (ad esempio quando aggiungi un riferimento a un servizio web). L'utente non deve assolutamente toccarlo e tuttavia deve essere spedito in un file separato. Bonus stupidità: le normali impostazioni delle app, incluse le stringhe di connessione, vengono incorporate nell'exe - puoi spedire l'exe da solo e si connetterà al database. Ma le impostazioni per un riferimento al servizio web non vengono incorporate e, non appena ne fai riferimento, devi distribuire '.config'. Questo è semplicemente stupido. – GSerg

+7

È peggio quando l'unica ragione per cui hai bisogno di app.config è assicurarti che il tuo programma si rifiuti di eseguire su .NET 4.0 - perché per qualche motivo Microsoft non può segnalare il requisito 4.5.2 nell'assembly stesso ... –

3

Generalmente, non si desidera eseguire questa operazione in quanto app.config fornisce un meccanismo con cui è possibile eseguire la configurazione in fase di esecuzione. Per quanto si obiettivo specifico (mantenendo la configurazione di fuori del proprio codice, ma farlo seguire il binario), si dispone di un paio di opzioni:

  • dinamicamente creare un file di configurazione
  • Conservare le impostazioni nel Registro di sistema
  • memorizzare le impostazioni come stringhe di risorse all'interno dell'applicazione console

sono sicuro che ci sono altri, più creativi, le opzioni disponibili. La mia raccomandazione sarebbe per la seconda opzione. All'avvio dell'applicazione, creare le chiavi necessarie e impostare i valori predefiniti dall'eseguibile. In questo modo, se hai bisogno di eseguire il debug in un secondo momento, puoi semplicemente eseguire regedit e apportare le modifiche necessarie senza ricompilare.

+0

Volevo che la cosa fosse totalmente indipendente, quindi penso che lascerò il registro da solo. Sembra che la tua opzione 3 sia la migliore per i miei scopi. – Patches

5

Vuoi dire che devi aggiungerlo all'exe come risorsa? Bene, prima di tutto non puoi, app.config è basato su file e non su risorse.

D'altra parte, l'unico punto del file di configurazione è che è possibile modificarlo. Altrimenti, solo hard-code o usare costanti.

8

Posso vedere dove stai andando con questo, ma la risposta potrebbe essere un po 'più complicata di quella che stavi cercando.

  1. Fai app.config per essere una risorsa incorporata .
  2. parsing manualmente l'app.config per ottenere predefinite stringhe impostazioni dell'applicazione/connessione/etc
  3. Ancora cercare un app.config e sovrascrivere le impostazioni predefinite che si leggono in precedenza con l'app.config valori

In questo modo si hanno alcune impostazioni predefinite ragionevoli che non è necessario mantenere separati da app.config come costanti, è possibile eseguire l'app come un exe e modificarla in fase di runtime aggiungendo nuovamente nell'app. config.

L'unica cosa da ricordare è che la lettura in app.config da una risorsa non ti darà lo stesso comportamento del normale app.config. Stai praticamente leggendo e usandolo a mano.

+1

Ug, sì, l'idea qui rende le cose più facili, non più difficili. Sembra che sia meglio fare solo un oggetto settings nel mio codice. – Patches

3

Come altri hanno sottolineato, l'idea alla base di un file di configurazione è di evitare valori hardcoded.

Quello che potresti fare in alternativa è scrivere una sezione di configurazione personalizzata, con ogni elemento opzionale e con valori predefiniti. In questo modo chiunque riesca a cavarsela con i valori predefiniti non ha bisogno di un file di configurazione. Ma se hanno bisogno di ignorare un valore predefinito, possono fornirne uno.

(Siamo spiacenti, solo un po 'di brainstorming. Non ho un esempio disponibili.)

+6

Sfortunatamente Microsoft (ab) ha usato questo file per cose diverse dalla configurazione. Vale a dire, viene utilizzato per forzare un'applicazione .NET 4.5 a rifiutarsi di eseguire su una versione precedente di .NET. Bass-ackwards per rendere questo configurabile dall'utente (mentre anche rendere le app single-exe impossibili), non è vero? –

3

Come le persone hanno da dire qui il punto centrale di un file di configurazione è per la modifica di alcune impostazioni di fuori dell'applicazione. È possibile codificare o utilizzare le costanti, ma è anche possibile utilizzare il registro in Windows, se lo si desidera. In questo modo è possibile apportare modifiche all'applicazione e avere ancora un solo file exe.

Il progetto di codice ha alcune buone informazioni su lettura, scrittura e cancellazione dal registro. http://www.codeproject.com/KB/system/modifyregistry.aspx Ma attenzione quando si modifica il registro. Un sacco di applicazioni dipendono da esso in modo da poter distruggere alcune impostazioni se si fa qualcosa di sbagliato. Consiglio di leggere e poi di fare.

public string Read(string KeyName) { 
RegistryKey rk = baseRegistryKey; 
// Open a subKey as read-only 

RegistryKey sk1 = rk.OpenSubKey(subKey); 
// If the RegistrySubKey doesn't exist -> (null) 

if (sk1 == null) 
{ 
    return null; 
} 
else 
{ 
    try 
    { 
     // If the RegistryKey exists I get its value 
     // or null is returned. 
     return (string)sk1.GetValue(KeyName.ToUpper()); 
    } 
    catch (Exception e) 
    { 
     // AAAAAAAAAAARGH, an error! 
     ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper()); 
     return null; 
    } 
    } 
} 

public bool Write(string KeyName, object Value) { 
    try 
    { 
     // Setting 
     RegistryKey rk = baseRegistryKey ; 
     // I have to use CreateSubKey 
     // (create or open it if already exits), 
     // 'cause OpenSubKey open a subKey as read-only 
     RegistryKey sk1 = rk.CreateSubKey(subKey); 
     // Save the value 
     sk1.SetValue(KeyName.ToUpper(), Value); 
     return true; 
    } 
    catch (Exception e) { 
     // AAAAAAAAAAARGH, an error! 
     ShowErrorMessage(e, "Writing registry " + KeyName.ToUpper()); 
     return false; 
    } 
    }  

public bool DeleteKey(string KeyName) { 
    try 
    { 
     // Setting 
     RegistryKey rk = baseRegistryKey ; 
     RegistryKey sk1 = rk.CreateSubKey(subKey); 
     // If the RegistrySubKey doesn't exists -> (true) 
     if (sk1 == null) 
      return true; 
     else 
      sk1.DeleteValue(KeyName); 
     return true; 
    } 
    catch (Exception e) 
    { 
     // AAAAAAAAAAARGH, an error! 
     ShowErrorMessage(e, "Deleting SubKey " + subKey); 
     return false; 
    } 
} 

Ovviamente funziona solo su Windows. Presumo che tu stia utilizzando Visual Studio, quindi probabilmente stai usando Windows.

Felice codifica e buona fortuna!

1

L'unione ha molto problema con eseguibile wpf anche lento. Ho finito per usare Cosura.Fody https://github.com/Fody/Costura e usare il parametro della riga di comando per passare il valore di configurazione della mia app. Anche utilizzando IExpress http://en.wikipedia.org/wiki/IExpress per creare eseguibile finale con argomenti riga di comando e exe fuse insieme

3

soluzione migliore sembra per creare da soli all'avvio dell'applicazione.

  1. Aggiungi app.config come una risorsa, rinominarlo in "APP_CONFIG"
  2. Verificare file di configurazione esiste
  3. In caso contrario, scrivere file con estensione config predefinito

codice di esempio:

Program.cs

[STAThread] 
    static void Main() 
    { 
     CreateConfigIfNotExists(); 
    } 

    private static void CreateConfigIfNotExists() 
    { 
     string configFile = string.Format("{0}.config", Application.ExecutablePath); 

     if (!File.Exists(configFile)) 
     { 
      File.WriteAllText(configFile, Resources.App_Config); 
     } 
    } 

Ricordare che durante la costruzione verrà scritta solo la configurazione corrente. Non lo aggiornerà automaticamente quando si distribuisce una nuova versione. Comprenderà la configurazione come è quando si costruisce. Ma questo potrebbe essere sufficiente :)

+0

Bella soluzione per alcuni casi d'uso. Tuttavia, molto spesso il programma di installazione viene eseguito con diritti di amministratore e può essere installato in C: \ Programmi. L'app viene eseguita senza diritti di amministratore, quindi non può scrivere nella cartella in cui è installato EXE (come in C: \ Programmi). – George

-2

Prendere una applicazione Winform, ad esempio, durante la compilazione, verrà generato un file "xxx.EXE.config" insieme al file EXE di output. Conterrà le impostazioni di "app.config". Distribuisci anche questo.

+1

-1 - Questo era quello che cercavo di evitare. Come evitare di farlo era tutta la mia domanda. – Patches