2016-11-22 60 views
0

我需要编辑不是运行代码的可执行文件的配置文件(exefilename.config)。 XML文件的格式是这样的:编辑另一个可执行文件的.config文件

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

我需要改变“DefaultPort”参数,“数据源”等,并在同一级别添加新的。我能怎么做?如果.config文件是我的可执行文件,那么使用简单的SettingsWriter将会更容易,但在这种情况下,我该怎么办?

+0

看一看这太问题:http://stackoverflow.com/questions/4738/using-配置管理员加载配置从任意位置 – Klinger

+0

我假设你有这个问题,因为你手动加载一个不同的应用程序的配置。为什么不能将配置复制到_your_应用的配置中,并使用适当的设置?或者使用用户级别的设置使回写更容易? –

+0

Klinger我在下面回答 – user3518663

回答

1

Web配置只是一个XML,所以为什么不把它当作一个呢?沿着这些线路的东西应该做的伎俩:

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

,并调用它像:

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

如果文件正在使用中,虽然你可能会出现问题。

0

我实现了Alex Nolasco建议的此线程中描述的代码:Change default app.config at runtime

但是当我尝试读取属性“数据源”像下面descripted,我仍然得到原始的.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. 

我有一个疑问:我是临时配置文件要读得到了一个不同的assemby可这是问题

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