Donnerstag, Mai 28, 2020

C#: Lesen und ändern von Einstellungen in einer anderen Anwendung die app.config-Datei

Ich habe eine Reihe von Anwendungen, die miteinander kommunizieren, aber keine dieser Anwendungen haben Ihre eigenen user interface. Ich habe ein system-Konsole-Anwendung, die fungiert als Benutzeroberfläche für das system (d.h. die Menge der Anwendungen, die alle miteinander reden).

Ich würde gerne in der Lage, verwenden Sie die system-console zu Lesen und ändern Sie die Konfiguration der nicht-gui-Anwendungen.

Jede app hat einen app.config-Datei erstellt mit der Visual Studio-Einstellungen GUI. Die Einstellungen sind alle im Geltungsbereich einer Anwendung, die Ergebnisse in einer app.config-Datei, die sieht ein bisschen aus wie diese:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="ExternalConfigReceiver.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<applicationSettings>
    <ExternalConfigReceiver.Properties.Settings>
        <setting name="Conf1" serializeAs="String">
            <value>3</value>
        </setting>
        <setting name="Conf2" serializeAs="String">
            <value>4</value>
        </setting>
    </ExternalConfigReceiver.Properties.Settings>
</applicationSettings>

Habe ich versucht mit dem folgenden code zum Lesen der Konfiguration-Einstellungen:

System.Configuration.ExeConfigurationFileMap fileMap = new   System.Configuration.ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "PATH_TO_THE_FOLDER\\app.config";

System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);

someVariable =  config.AppSettings.Settings["Conf1"];
someVariable2 = config.AppSettings.Settings["Conf2"];

Jedoch bei näherer Betrachtung der config.AppSettings-Objekt, ich finde, es enthält keine Einstellungen.

Was mache ich falsch? Bin ich mit der falschen Methode zum Lesen der config-Datei? Ist diese Methode am besten für eine andere Art von config-Datei?

  • Ich denke du meinst Settings["Conf1"].Value Sie sollten in der Lage sein, etwas zu bekommen, oder bekommst du eine Fehlermeldung ?
  • Wenn dies geschieht, Laufzeit, dann gibt es das Hilfspersonal keine app.config-Datei – config-Datei der Anwendung.exe.config oder was auch immer den Namen main executable
  • Dies ist zwar möglich, würde ich empfehlen, gegen es – es ermöglicht einer Anwendung (die console app) zu brechen anderen Anwendung, indem vermasselt seine Konfiguration, und es zwingt das Verständnis der Art und Weise Ihrer individuellen apps sind so konfiguriert werden, verteilt auf mindestens zwei Orte. Stattdessen würde ich empfehlen, hinzufügen ein „ändere Einstellung“ – Nachricht an die app, und die message-handler aktualisieren Sie die Einstellung.

2 Kommentare

  1. 4

    Ist es möglich, um die config-Datei als XML und dann die XPath-um die Werte zu ändern:

    using (TransactionScope transactionScope = new TransactionScope())
    {
        XmlDocument configFile = new XmlDocument();
    
        configFile.Load("PathToConfigFile");
    
        XPathNavigator fileNavigator = configFile.CreateNavigator();
    
        //User recursive function to get to the correct node and set the value
        WriteValueToConfigFile(fileNavigator, pathToValue, newValue);
    
        configFile.Save("PathToConfigFile");
    
        //Commit transaction
        transactionScope.Complete();
    }
    
    private void WriteValueToConfigFile(XPathNavigator fileNavigator, string remainingPath, string newValue)
    {
        string[] splittedXPath = remainingPath.Split(new[] { '/' }, 2);
        if (splittedXPath.Length == 0 || String.IsNullOrEmpty(remainingPath))
        {
            throw new Exception("Path incorrect.");
        }
    
        string xPathPart = splittedXPath[0];
        XPathNavigator nodeNavigator = fileNavigator.SelectSingleNode(xPathPart);
    
        if (splittedXPath.Length > 1)
        {
            //Recursion
            WriteValueToConfigFile(nodeNavigator, splittedXPath[1], newValue);
        }
        else
        {
            nodeNavigator.SetValue(newValue ?? String.Empty);
        }
    }

    Möglich Weg zu Conf1:

    "configuration/applicationSettings/ExternalConfigReceiver.Properties.Settings/setting[name=\"Conf1\"]/value"

  2. -1

    soweit ich weiß, man kann das System nutzen.- Konfiguration.Konfiguration Zugriff auf config-Dateien von anderen Anwendungen

    Sie sind xml-Dateien, und Sie können die xml-namspace, mit Ihnen zu interagieren

Kostenlose Online-Tests