2009-04-24 6 views
5

Как я могу динамически изменить connectionString в файле app.config?Изменение app.config во время установки

У меня есть приложение, написанное с окнами, C# 3.0 и Linq to Sql. Мне нужно изменить строку подключения при установке приложения. Как я это делаю?

Когда пользователь устанавливает программу, он должен показать форму с возможностью изменения строки соединения, если она существует, или добавить ее, если она не установлена.

ответ

0

Отъезд this question. Он имеет то, что вам нужно для динамического изменения значений в app.config с помощью кода.

+0

Я смотрел старую версию вопроса. Используя предоставленную мной ссылку, вы можете иметь всплывающее окно при первом запуске приложения, чтобы побудить пользователя изменить ситуацию. –

5

Запишите дополнительный файл конфигурации с блоком appSettings, используя настройки установщика. В вашей основной конфигурационный файл, используйте атрибут файла в AppSettings ссылаться на второй конфигурационный файл, например так:

<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(); 
     } 
    } 
} 
+0

Я думаю, что это ответ !! – Marshal

+0

Можете ли вы рассказать мне, какой должен быть путь к цели. Я включил файл User.Config непосредственно в проект, не можем ли мы просто написать User.config, не комбинируя его с целевым путем. Я попробовал вышеуказанный код ... но не работал. Однако он не вызывает никаких ошибок. – Marshal

+1

@ Маршал: К сожалению, я не видел этого раньше, но если я правильно помню, TargetDir - это параметр, установленный установщиком по умолчанию, и он должен быть установлен в каталог установки. Попробуйте добавить несколько операторов регистрации, чтобы узнать, что такое Context.Parameters ["TargetDir"], когда вы пытаетесь записать файл конфигурации. –

6

Если вы используете проект развертывания .NET, можно добиться этого с помощью пользовательских действий.

+0

Нужно ли писать какие-либо vbs в пользовательских действиях? Я должен создать и сохранить объект стороннего класса в настройках во время установки – Heena

Смежные вопросы