2016-11-22 2 views
0

Je dois éditer le fichier de configuration (exefilename.config) d'un exécutable qui n'est pas celui à partir duquel le code est exécuté. Le format de fichier XML est la suivante:Modifier un fichier .config d'un autre exécutable

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

Je dois changer les paramètres "DefaultPort", "DataSource" etc .. et en ajoutant de nouvelles au même niveau. Comment puis-je faire? Si le fichier .config était celui de mon exécutable, la situation serait beaucoup plus facile avec un simple SettingsWriter, mais dans ce cas comment puis-je faire?

+0

Jetez un oeil à cette question SO: http://stackoverflow.com/questions/4738 /en utilisant- configurationmanager-to-load-config-from-a-arbitraire-location – Klinger

+0

Je suppose que vous avez ce problème parce que vous chargez manuellement une configuration pour une application différente. Pourquoi ne pouvez-vous pas simplement copier la configuration dans la configuration de l'application _your_ et utiliser les paramètres appropriés? Ou utiliser les paramètres au niveau de l'utilisateur pour faire est plus facile à écrire? –

+0

Klinger je réponds ci-dessous – user3518663

Répondre

1

Web config est juste un XML, alors pourquoi ne pas le traiter comme un seul? Quelque chose le long de ces lignes devrait faire l'affaire:

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); 
    } 

et l'appeler comme:

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

Vous obtiendrez peut-être un problème si le fichier est utilisé bien.

0

Je mets en œuvre le code décrit dans ce fil: Change default app.config at runtime comme suggéré par Alex Nolasco.

Mais lorsque je tente de lire la propriété « DataSource » comme descripted ci-dessous, je reçois toujours la valeur .config originale :-(

// 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. 

J'ai un doute: le fichier de configuration temporaire que je suis va lire a obtenu un autre assemby peut-il être le problème

Voici le code AppConfig:.?

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); 
      } 
     } 
    } 
}