2012-04-16 11 views
0

app.config(接続文字列部分)を変更できるアプリケーションを作成しました。私はいくつかの解決策を試しましたが、これは私の問題の1つを解決する最も簡単な方法であることが判明しました。これは私が使用するコードです:別のアプリケーションから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メソッド内に配置され、私はそのボタンをクリックして、変更が表示されているアプリケーションを再起動するとされます。 私の質問はこれです - ユーザーがテキストボックスに必要な値を入力するか、またはcomboBoxから選択することによって接続文字列を作成できるようにする別の(独立した)アプリケーションから行う方法はありますか?サーバーの名前とデータベースの名前)。これにより、最初のアプリケーションが準備され、変更を適用するために再起動する必要はありません。 これを行う方法はありますか?

+0

両方のアプリケーションを制御していますか? –

+0

はい。このアプリケーションは2種類のユーザー(管理者と作業者)によって使用されるため、管理者がアプリケーション設定を変更できるようにしたいと考えていますが、この機能が存在することに気づく必要はありません。私の代わりは、ユーザーがログインする資格情報に応じてMenuStrip項目を表示することですが、最初の方法は私にとってはよりエレガントです(変更を適用するアプリケーションを再起動する必要はありません。 – NDraskovic

+0

これらのアプリケーションが同じマシン上で実行されている場合、カスタムウィンドウメッセージを送信したり、WCFを使用したりすることができます(List-Based Publish-Subscribeの例を参照してください)。http://msdn.microsoft.com/en- us/library/ms752254.aspx –

答えて

1

両方のアプリケーションが同じマシン上にあるので、あなたは、単純なウィンドウメッセージングを使用することができ、アプリケーションおよびReceiverに送信者のポストメッセージの両方に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); 
     } 
    } 
    } 

btw VSデバッガで起動したときに動作するように、プロセス名「Receiver.vshost」をチェックしていることに注意してください。

関連する問題