我创建了一个能够更改其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服务器和数据库的名称)。通过这样做,第一个应用程序将准备好,并且不需要重新启动它来应用更改。 有没有办法做到这一点?
答案 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调试器中启动时可以正常工作