Frage

Ich mag die Verwendung der Standard-app.config außer Kraft zu setzen, indem Sie einen Befehlszeilenparameter übergeben. Wie kann ich die Konfiguration Standardanwendungsdatei ändern, so dass, wenn ich Zugriff auf ConfigurationManager.AppSettings ich die Config-Datei auf der Befehlszeile angegeben bin zugreifen?

Edit:

Es stellt sich heraus, dass der richtige Weg, um eine Konfigurationsdatei zu laden, die als der Name der EXE-Datei unterscheidet 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);

Diese teilweise funktioniert. Ich kann alle Schlüssel in den appSettings siehe Abschnitt aber alle Werte sind null.

War es hilfreich?

Lösung

hier So 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;

Andere Tipps

Eine Batch-Datei, die Kopien Ihre gewünschte Konfigurationsdatei appname.exe.config und führt dann den appname.exe.

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, das ich diesen Weg gegangen:

  1. Halten Sie mehrere Konfigurationsdateien im XML-Format ähnlich wie app.config
  2. Legen Sie die angegebene Konfigurationsdatei in ein DataSet (via .ReadXML) und verwenden Sie das Datatable mit der Config-Info in ihm als mein Objekt Konfiguration .
  3. Also alle meine Code befasst sich nur mit der Konfiguration Datatable auf Werte abrufen und nicht, dass craptastically app Config Objekt verschleiert.

dann kann ich in übergeben, was auch immer Config-Dateinamen muß ich auf der Kommandozeile, und wenn man nicht da ist -. Nur laden app.config in die DataSet

Jeezus es war sooo viel einfacher danach. : -)

Ron

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

Holen Sie sich aktuelle oder Benutzerkonfiguration in die Config Objekt

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 Config-Objekt

AppSettingsSection s = (AppSettingsSection)config.GetSection("appSettings");
KeyValueConfigurationCollection a = s.Settings;
ConnectionString = a["ConnectionString"].Value;

Dies ist nicht genau das, was Sie wollen ... die eigentliche ConfigurationManager statisches Objekt zu Punkt, an einem anderen Weg. Aber ich denke, es ist die richtige Lösung für Ihr Problem. Schauen Sie sich 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, einen Blick auf mit dem Konfiguration Fähigkeiten der Enterprise Library Framework (entwickelt und gepflegt von dem Microsoft Patterns & Practices-Team).

nehmen Insbesondere einen Blick auf die FileConfigurationSource Klasse.

Hier ist ein Code, der die Verwendung des FileConfigurationSource von Enterprise Library , ich glaube, das Ihre Ziele voll erfüllt. Die einzige Baugruppe, die Sie von Ent Lib hierfür 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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top