C# 在安装时更改app.config

C# 在安装时更改app.config,c#,linq,deployment,C#,Linq,Deployment,如何动态更改app.config文件中的connectionString 我有一个用windows窗体、c#3.0和Linq to Sql编写的应用程序。我需要在安装应用程序时更改连接字符串。我是怎么做到的 当用户安装该程序时,它必须显示一个表单,其中包含一个选项,如果存在,则可以更改连接字符串;如果不存在,则可以添加连接字符串。签出。它具有通过代码动态更改app.config中的值所需的功能。使用安装程序中的设置,使用appSettings块编写辅助配置文件。在主配置文件中,使用appSett

如何动态更改app.config文件中的connectionString

我有一个用windows窗体、c#3.0和Linq to Sql编写的应用程序。我需要在安装应用程序时更改连接字符串。我是怎么做到的


当用户安装该程序时,它必须显示一个表单,其中包含一个选项,如果存在,则可以更改连接字符串;如果不存在,则可以添加连接字符串。

签出。它具有通过代码动态更改app.config中的值所需的功能。

使用安装程序中的设置,使用appSettings块编写辅助配置文件。在主配置文件中,使用appSettings中的file属性引用第二个配置文件,如下所示:

<appSettings file="User.config">

辅助配置中的设置将覆盖主配置中的任何匹配键

在安装程序中:

public override void Install(IDictionary stateSaver)
{
    base.Install(stateSaver);

    string server = Context.Parameters["Server"];
    string port = Context.Parameters["Port"];
    string targetDir = Context.Parameters["TargetDir"];
    // Build your connection string from user-input parameters and add them to dictionary

    WriteAppConfig(targetDir, server, port);
}

private void WriteAppConfig(string targetDir, string server, string port)
{
    string configFilePath = Path.Combine(targetDir, "User.config");

    IDictionary<string, string> userConfiguration = new Dictionary<string, string>();

    userConfiguration["Server"] = server;
    userConfiguration["Port"] = port;

    ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration);
}

public class ConfigGenerator
{
    public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration)
    {
        using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8))
        {
            xw.Formatting = Formatting.Indented;
            xw.Indentation = 4;
            xw.WriteStartDocument();
            xw.WriteStartElement("appSettings");

            foreach (KeyValuePair<string, string> pair in userConfiguration)
            {
                xw.WriteStartElement("add");
                xw.WriteAttributeString("key", pair.Key);
                xw.WriteAttributeString("value", pair.Value);
                xw.WriteEndElement();
            }

            xw.WriteEndElement();
            xw.WriteEndDocument();
        }
    }
}
public override void安装(IDictionary stateSaver)
{
安装(stateSaver);
字符串服务器=上下文。参数[“服务器”];
string port=Context.Parameters[“port”];
字符串targetDir=Context.Parameters[“targetDir”];
//从用户输入参数生成连接字符串并将其添加到字典中
WriteAppConfig(targetDir、服务器、端口);
}
私有void WriteAppConfig(字符串targetDir、字符串服务器、字符串端口)
{
字符串configFilePath=Path.Combine(targetDir,“User.config”);
IDictionary userConfiguration=新字典();
用户配置[“服务器”]=服务器;
用户配置[“端口”]=端口;
WriteExternalAppConfig(configFilePath,userConfiguration);
}
公共类配置生成器
{
公共静态void WriteExternalAppConfig(字符串配置文件路径,IDictionary用户配置)
{
使用(XmlTextWriter xw=新的XmlTextWriter(configFilePath,Encoding.UTF8))
{
xw.Formatting=格式化.缩进;
压痕=4;
xw.WriteStartDocument();
xw.WriteStarteElement(“应用设置”);
foreach(userConfiguration中的KeyValuePair对)
{
xw.书面声明(“添加”);
xw.WriteAttributeString(“key”,pair.key);
WriteAttributeString(“value”,pair.value);
xw.WriteEndElement();
}
xw.WriteEndElement();
xw.WriteEndDocument();
}
}
}

如果您使用的是.NET部署项目,则可以通过使用自定义操作来实现这一点。

我正在研究这个问题的旧版本。使用我提供的链接,您可以在应用程序第一次启动时弹出一个屏幕,提示用户更改内容。我想这就是答案!!你能告诉我目标路径应该是什么吗。我已经在项目中直接包含了User.Config文件,我们不能只编写User.Config而不将其与目标路径结合起来吗。我尝试了上面的代码..但不起作用。但是,它也不会引发任何错误。@Marshal:很抱歉,我以前没有看到这个,但是如果我没有记错的话,TargetDir是安装程序默认设置的参数,应该设置为安装目录。尝试插入一些日志语句,以查看当您尝试写入配置文件时,Context.Parameters[“TargetDir”]是什么。是否需要在自定义操作中写入任何vbs?我必须在安装时创建第三方类的对象并将其存储到设置中