从另一个应用程序更改app.config

时间:2012-04-16 08:09:26

标签: c# database-connection app-config

我创建了一个能够更改其app.config(连接字符串部分)的应用程序。我尝试了几种解决方案,这被证明是解决我的一个问题的最简单方法。这是我使用的代码:

ConnectionStringSettings postavke = new ConnectionStringSettings("Kontrolor.Properties.Settings.KontrolorConnectionString", constring);
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.ConnectionStrings.ConnectionStrings.Clear();
config.ConnectionStrings.ConnectionStrings.Add(postavke);   

config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.SectionName);

此代码放在button_click方法中,当我单击该按钮并重新启动应用程序时,可以看到更改。 我的问题是 - 有没有办法从另一个(独立的)应用程序执行它,使用户能够通过在textBox中输入所需的值或从comboBox中选择它来创建连接字符串(他只需要输入IP服务器和数据库的名称)。通过这样做,第一个应用程序将准备好,并且不需要重新启动它来应用更改。 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

由于两个应用程序都在同一台机器上,您可以使用简单的Windows消息传递,在两个应用程序中注册Windows消息,发送者向接收者发送消息,这是示例代码:

发件人:

  public partial class FormSender : Form
  {
    [DllImport("user32")]
    private static extern int RegisterWindowMessage(string message);

    private static readonly int WM_REFRESH_CONFIGURATION = RegisterWindowMessage("WM_REFRESH_CONFIGURATION");

    [DllImport("user32")]
    private static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);

    public FormSender()
    {
      InitializeComponent();
    }

    private void btnNotify_Click(object sender, EventArgs e)
    {
      NotifyOtherApp();
    }

    private void NotifyOtherApp()
    {
      List<Process> procs = Process.GetProcesses().ToList();
      Process receiverProc = procs.Find(pp => pp.ProcessName == "Receiver" || pp.ProcessName == "Receiver.vshost");  
      if (receiverProc != null)
        PostMessage((IntPtr)receiverProc.MainWindowHandle, WM_REFRESH_CONFIGURATION, new IntPtr(0), new IntPtr(0));
    }
  }

接收者:

 public partial class FormReceiver : Form
  {
    [DllImport("user32")]
    private static extern int RegisterWindowMessage(string message);

    private static readonly int WM_REFRESH_CONFIGURATION = RegisterWindowMessage("WM_REFRESH_CONFIGURATION");

    public FormReceiver()
    {
      InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
      if (m.Msg == WM_REFRESH_CONFIGURATION)
      {
        lblMessageReceived.Text = "Refresh message recevied : " + DateTime.Now.ToString();
      }
      else
      {
        base.WndProc(ref m);
      }
    }
  }

顺便说一句。请注意我正在检查进程名称“Receiver.vshost”,以便在VS调试器中启动时可以正常工作