2008-10-02 12 views
15

Ich möchte die Verwendung der Standard-app.config durch Übergeben eines Befehlszeilenparameters überschreiben. Wie ändere ich die Standardanwendungskonfigurationsdatei, damit ich beim Zugriff auf ConfigurationManager.AppSettings auf die in der Befehlszeile angegebene Konfigurationsdatei zugreife?Wie wähle ich eine .Net-Anwendungskonfigurationsdatei über einen Befehlszeilenparameter aus?

Edit:

Es stellt sich heraus, dass der richtige Weg, um eine Konfigurationsdatei zu laden, die als der Name der EXE-Datei unterscheiden und .config ist OpenMappedExeConfiguration zu verwenden. Z.B.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); 
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Shell2.exe.config"); 
currentConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None); 

Dies funktioniert teilweise. Ich kann alle Schlüssel im Abschnitt appSettings sehen, aber alle Werte sind null.

Antwort

13

So, hier ist der Code, den ich eigentlich tatsächlich erlaubt, in einer Konfigurationsdatei den Abschnitt appSettings Zugriff auf andere als der Standard ein.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); 
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Alternate.config"); 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None); 

AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings"); 
string MySetting = section.Settings["MySetting"].Value; 
+1

Gute Lösung, danke fürs Teilen. –

2

Eine Stapeldatei, die die gewünschte Konfigurationsdatei in appname.exe.config kopiert und anschließend die Datei appname.exe ausführt.

+0

Danke für alle Support-Jungs und Mädels. Während Sie es vielleicht nicht mögen, funktioniert es. In letzter Zeit ist mein Ansatz eine -c = file.config und eine generische Konsolen-App und ein Darrel-Ansatz. Ich habe immer noch die generische Konsole app kopieren Sie die Datei theapp.exe.config auf die app.exe, um .NET zu täuschen. – kenny

+1

Dies ist die einzige Antwort (einschließlich der akzeptierten), die tatsächlich das ursprüngliche gewünschte Ergebnis in irgendeiner Weise erreicht. –

+0

Diese Lösung hat mehrere Nachteile. Der wichtigste: Soweit ich weiß, sollte eine Anwendung keine Dateien unterhalb des Ordners Programme ändern. Welchen Sinn hat es, die Konfigurationsdatei neben der EXE-Datei im Allgemeinen zu platzieren? Die Anwendung kann dann ihre eigene Konfiguration nicht ändern. Es ist im Allgemeinen ein guter Stil, die Konfiguration der Anwendung unter das Home-Verzeichnis des Benutzers zu stellen. Windows verfügt jedoch immer noch nicht über ein zentrales Konfigurationsdateiverzeichnis wie/etc, um systemweite Konfigurationsdateien zu speichern. – realtime

0

Dies ist nicht genau das, was Sie wollen ... das tatsächliche ConfigurationManager statische Objekt umleiten, um auf einen anderen Pfad zu zeigen. Aber ich denke, es ist die richtige Lösung für Ihr Problem. Überprüfen Sie die OpenExeConfiguration Methode auf der ConfigurationManager Klasse.

Wenn das oben beschriebene Verfahren ist nicht das, was Sie suchen ich denke, es auch wert sein würde mit den Configuration capabilities der Enterprise Library Framework, einen Blick (entwickelt und gepflegt von dem Microsoft Patterns & Practices Team).

Werfen Sie einen Blick auf die Klasse FileConfigurationSource.

Hier ist ein Code, der die Verwendung der FileConfigurationSource von Enterprise Library hervorhebt, ich glaube, dass dies vollständig Ihre Ziele erfüllt. Die einzige Baugruppe, die Sie von Ent Lib benötigen, ist Microsoft.Practices.EnterpriseLibrary.Common.dll.

static void Main(string[] args) 
{ 
    //read from current app.config as default 
    AppSettingsSection ass = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings; 

    //if args[0] is a valid file path assume it's a config for this example and attempt to load 
    if (args.Length > 0 && File.Exists(args[0])) 
    { 
     //using FileConfigurationSource from Enterprise Library 
     FileConfigurationSource fcs = new FileConfigurationSource(args[0]); 
     ass = (AppSettingsSection) fcs.GetSection("appSettings"); 
    } 

    //print value from configuration 
    Console.WriteLine(ass.Settings["test"].Value); 
    Console.ReadLine(); //pause 
} 
+0

Das seltsame an diesem Beispiel ist, dass es die Standardkonfigurationsdatei lädt. Wenn ich den exePath zu etwas anderem ändere, schlägt die OpenExeConfiguration fehl. –

+0

Ich werde Ihnen in den nächsten 20 Minuten ein Codebeispiel bringen, aber ich ging weiter und aktualisierte eine mögliche Alternative. –

+0

Ironischerweise verwendet diese Anwendung tatsächlich CAB aus der P & P-Gruppe, aber ich habe alle EntLib-Sachen extrahiert, da es für mich Overkill ist. Ich denke ernsthaft darüber nach, eine XML-Datei in den Ordner einzufügen. Es wäre so viel einfacher. –

1

Ich brauchte diese für eine App von mir als auch zu tun, und mit der Standard-Konfiguration zu tun Objekte in eine solche freakin Streit drehte sich für so ein einfaches Konzept, dass ich diesen Weg gegangen:

  1. mehrere Konfigurationsdateien im XML-Format ähnlich halten
  2. laden die angegebene Konfigurationsdatei in einen DataSet (via .ReadXML) und verwenden sie die Datatable mit der Config-Info in es als meine Konfigu app.config Rationsobjekt.
  3. Also mein ganzer Code beschäftigt sich nur mit der Konfiguration DataTable, um Werte abzurufen und nicht das craptastischely verunstaltete App Config-Objekt.

dann kann ich in welchen Konfigurationsdateinamen gebe ich auf der Kommandozeile benötigen, und wenn man nicht da ist - nur laden app.config in den DataSet.

Jeezus es war sooo viel einfacher danach.:-)

Ron

+0

Ich höre dich. Ich warte auf den Tag, an dem mir klar wird, dass das der Vorteil von .config-Dateien ist. Dieser Tag ist nicht gekommen. –

1

Dies ist der relevante Teil der Quelle für APP, die Standardkonfiguration verwendet und akzeptiert per Kommandozeile überschreiben:

Strom oder Benutzerkonfiguration in das Objekt Config Get

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
string defCfgName = Environment.GetCommandLineArgs()[0] + ".config"; 

if (arg.Length != 0) 
{ 
    string ConfigFileName = arg[0]; 
    if (!File.Exists(ConfigFileName)) 
     Fatal("File doesn't exist: " + ConfigFileName, -1);     
    config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = ConfigFileName }, ConfigurationUserLevel.None); 
} 
else if (!File.Exists(defCfgName)) Fatal("Default configuration file doesn't exist and no override is set." , -1); 

Verwenden Sie das Konfigurationsobjekt

Verwandte Themen