2016-11-22 4 views
0

Ich muss die Konfigurationsdatei (exefilename.config) einer ausführbaren Datei bearbeiten, die nicht die ist, von der der Code ausgeführt wird. Das XML-Dateiformat ist folgende:Bearbeiten Sie eine .config-Datei einer anderen ausführbaren Datei

<configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <section name="XNet.XNetService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> 
     <section name="XNetService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> 
    </sectionGroup> 
</configSections> 
<applicationSettings> 
    <XNet.XNetService.Properties.Settings> 
     <setting name="DataSource" serializeAs="String"> 
      <value>192.168.2.127</value> 
     </setting> 
     <setting name="DefaultPort" serializeAs="String"> 
      <value>8085</value> 
     </setting> 
     <setting name="UserName" serializeAs="String"> 
      <value>notiuser</value> 
     </setting> 
     <setting name="Password" serializeAs="String"> 
      <value>6ITLet6k1HCOhgTmXI5C/1m1DrCQli8dIAKfdtP+o6w=</value> 
     </setting> 
     <setting name="Instance" serializeAs="String"> 
      <value /> 
     </setting> 
     <setting name="bindTo" serializeAs="String"> 
      <value /> 
     </setting> 
    </XNet.XNetService.Properties.Settings> 
</applicationSettings> 

Ich brauche die „Default“ Parameter ändern „Datasource“ etc .. und das Hinzufügen von neuen auf dem gleichen Niveau. Wie kann ich? Wenn die .config-Datei die meiner ausführbaren Datei wäre, wäre die Situation mit einem einfachen SettingsWriter viel einfacher, aber in diesem Fall, wie kann ich das tun?

+0

Werfen Sie einen Blick auf diese Frage SO: http://stackoverflow.com/questions/4738/using- configurationsmanager-to-load-config-from-an-arbitrary-location – Klinger

+0

Ich gehe davon aus, dass Sie dieses Problem haben, weil Sie manuell eine Konfiguration für eine andere App laden. Warum können Sie nicht einfach die Konfiguration in die Konfiguration für _ihr_ App kopieren und die entsprechenden Einstellungen verwenden? Oder benutze Benutzerleveleinstellungen, um das Zurückschreiben zu erleichtern? –

+0

Klinger antworte ich unten – user3518663

Antwort

1

Web Config ist nur ein XML, also warum nicht einfach so behandeln? Etwas in dieser Richtung sollte es tun:

void ModifyConfig(string filepath, string xpath, string newValue) 
    { 
     System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
     doc.Load(filepath); 
     System.Xml.XmlNode elementToReplace = doc.DocumentElement.SelectSingleNode(xpath); 
     elementToReplace.InnerText = newValue; 
     doc.Save(filepath); 
    } 

und nennen es mag: wenn

 ModifyConfig("C:\\temp\\App.config", 
      "applicationSettings//XNet.XNetService.Properties.Settings//setting[@name='DefaultPort']//value", 
      "5000"); 

Sie könnten ein Problem bekommen, wenn die Datei in Gebrauch ist.

0

Ich implementiere den Code in diesem Thema beschrieben: Change default app.config at runtime wie von Alex Nolasco vorgeschlagen.

Aber wenn ich versuche, die Eigenschaft „Datasource“ zu lesen, wie unten descripted, bekomme ich immer noch den ursprünglichen Wert .config :-(

// the default app.config is used. 
using (AppConfig.Change(exePath)) 
{ 
    // the app.config in exePath is used 

    string test = Properties.Settings.Default.DataSource; 

} 
// the default app.config is used. 

ich einen Zweifel haben: die temporäre Konfigurationsdatei, die ich bin gehen zu lesen hat eine andere assemby bekam Kann dies das Problem

Dies ist der AppConfig Code:.?

using System; 
using System.Configuration; 
using System.Linq; 
using System.Reflection; 

namespace XNet.XManager 
{ 
    public abstract class AppConfig : IDisposable 
    { 
     public static AppConfig Change(string path) 
     { 
      return new ChangeAppConfig(path); 
     } 

     public abstract void Dispose(); 

     private class ChangeAppConfig : AppConfig 
     { 
      private readonly string oldConfig = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); 

      private bool disposedValue; 

      public ChangeAppConfig(string path) 
      { 
       AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); 
       ResetConfigMechanism(); 
      } 

      public override void Dispose() 
      { 
       if (!disposedValue) 
       { 
        AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig); 
        ResetConfigMechanism(); 


        disposedValue = true; 
       } 
       GC.SuppressFinalize(this); 
      } 

      private static void ResetConfigMechanism() 
      { 
       typeof(ConfigurationManager) 
        .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static) 
        .SetValue(null, 0); 

       typeof(ConfigurationManager) 
        .GetField("s_configSystem", BindingFlags.NonPublic |BindingFlags.Static) 
        .SetValue(null, null); 

       typeof(ConfigurationManager) 
        .Assembly.GetTypes() 
        .Where(x => x.FullName == 
           "System.Configuration.ClientConfigPaths") 
        .First() 
        .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static) 
        .SetValue(null, null); 
      } 
     } 
    } 
} 
Verwandte Themen