编辑另一个可执行文件的.config文件

时间:2016-11-22 16:42:37

标签: c# xml app-config

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

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

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

2 个答案:

答案 0 :(得分: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");

如果文件正在使用中,您可能会遇到问题。

答案 1 :(得分:0)

我按照Alex Nolasco的建议实现了此主题中描述的代码:Change default app.config at runtime

但是当我尝试阅读下面描述的属性“Datasource”时,我仍然得到原始的.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.

我有一个疑问:我要阅读的临时配置文件有不同的组合。这可能是问题吗?

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