2016-07-06 12 views
0

Ich habe ein Konsolenprogramm 'A', das zu einem bestimmten Zeitpunkt Programm 'B' und Programm 'C' ausführen wird. Allerdings habe ich ein Problem mit der app.config-Verknüpfung mit jedem Programm. Grundsätzlich ist Programm A nur eine Wrapper-Klasse, die eine andere Konsolenanwendung aufruft. Sie sollte keine app.config haben, aber sie sollte die App-Konfiguration des aktuell laufenden Programms verwenden. Also in der Theorie sollte es nur 2 app.config eine für Programm B und eine andere für Programm C.C# Konfigurationsdatei in exe einbetten

Also, wenn wir Programm A und Programm B ausgeführt ausgeführt wird, sollte es Programm B's app.config verwenden, um die Informationen zu erhalten und Danach, wenn Programm C ausgeführt wird, sollte es App.config von Programm C verwenden.

Gibt es eine Möglichkeit, dies zu tun? Derzeit mache ich das:

var value = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location).AppSettings.Settings["ProgramBKey"].Value; 

Es scheint nicht zu funktionieren. Ich überprüfte das debug auf Assembly.GetExecutingAssembly().Location es ist Variable ist die \ bin \ Debug \ ProgramB.exe und "ConfigurationManager.OpenExeConfiguration (Assembly.GetExecutingAssembly(). Location) .AppSettings" hat Einstellung mit Count = 0, wenn Schlüsselwerte wie unten angezeigt werden.

Beispielcode Programm A:

static void Main(string[] args) 
{ 
    if(caseB) 
     B.Program.Main(args) 
    else if(caseC) 
     C.Program.Main(args) 
} 

Probe app.config für Programm B:

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="ProgramBKey" value="Works" /> 
    </appSettings> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> 
    </startup> 
</configuration> 
+0

Wie starten Sie diese anderen '.exe' Programme? – Adam

+0

Sie sind alle Konsolenanwendung –

+0

Also ein einfacher 'Applicaton.Run()' Anruf? – Adam

Antwort

1

Für mich klingt das Ganze wie ein "Design-Problem". Warum sollten Sie Programm B mit der Konfiguration von Programm A öffnen?

Sind Sie der Autor all dieser Programme? Vielleicht möchten Sie stattdessen eine DLL-Datei verwenden. Dies erspart Ihnen die Probleme, da der gesamte Code mit der Konfiguration des Programms läuft.

+0

Der Grund, warum es von A läuft, ist, weil Programm B ein sein kann eigenständige Konsolenanwendung selbst Deshalb konnte ich es nicht zu einer DLL machen.Aber wenn ich sie zu einer DLL gemacht hätte (ja, ich bin der Autor aller Programme), würde das das Problem für app.config lösen? –

+0

zum Beispiel kann ein Benutzer Programm B unabhängig von anderen ausführen. Programm A ist nur ein Hilfsprogramm, um herauszufinden, ob B ausgeführt werden muss oder ob C ausgeführt werden muss. –

+0

die Frage aktualisiert –

2

Edit: die folgende Antwort bezieht sich auf diese Frage aus dem ursprünglichen Beitrag "Ist es möglich, die app.config für B und C innerhalb der EXE des Programms zu kompilieren."

Sie können die Funktion "Embedded Resource" verwenden. Hier ist ein kleines Beispiel eine XML-Datei zu verwenden, die als eingebettete Ressource aufgenommen worden ist:

public static class Config 
{ 
    static Config() 
    { 
     var doc = new XmlDocument(); 
     using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Fully.Qualified.Name.Config.xml")) 
     { 
      if (stream == null) 
      { 
       throw new EndOfStreamException("Failed to read Fully.Qualified.Name.Config.xml from the assembly's embedded resources."); 
      } 

      using (var reader = new StreamReader(stream)) 
      { 
       doc.LoadXml(reader.ReadToEnd()); 
      } 
     } 

     XmlElement aValue = null; 
     XmlElement anotherValue = null; 

     var config = doc["config"]; 
     if (config != null) 
     { 
      aValue = config["a-value"]; 
      anotherValue = config["another-value"]; 
     } 

     if (aValue == null || anotheValue == null) 
     { 
      throw new XmlException("Failed to parse Config.xml XmlDocument."); 
     } 

     AValueProperty = aValue.InnerText; 
     AnotherValueProperty = anotherValue.InnerText; 
    } 
} 
+1

die Frage .. diese Antwort aktualisiert direkt im Kontext vor ... aber ich denke, die Frage –

1

Sie mehrere Anwendungs ​​haben die gleiche Konfigurationsdatei verwenden. Auf diese Weise können Sie, wenn Sie zwischen Anwendungen wechseln, ihre eigenen Teile der Konfigurationsdatei finden.

Die Art, wie ich normalerweise tue es ... zuerst jede Anwendung lassen „sein eigenes Ding machen“, dann die entsprechenden Abschnitte der Konfigurationsdatei A kopiert in config-Datei B.

Es wird wie folgt aussehen:

<configSections> 
    <sectionGroup> 
     <sectionGroup name="applicationSettings"...A> 
     <sectionGroup name="userSettings"...A> 
     <sectionGroup name="applicationSettings"...B> 
     <sectionGroup name="userSettings"...B> 

<applicationSettings> 
    <A.Properties.Settings> 
    <B.Properties.Settings> 

<userSettings> 
    <A.Properties.Settings> 
    <B.Properties.Settings> 
+0

Das einzige Problem mit diesem nicht klar genug war, dass wir alle Änderungen an Programm B-Konfigurationsdatei haben, wenn es Aktualisieren Sie auch die Konfigurationsdatei von Programm A für den Teil, der geändert wurde nein? Also muss es ein Update app.config (für Programa) jedes Mal gibt es eine Änderung in einem der Programme –

+0

die Frage aktualisiert –