5

全て。最初に、Send data back to .exe from dllという質問を認識していますが、そこにある回答には未解決の問題が多すぎます。私が試みていることの経験がないので、新しい質問が必要だと感じています。

SQL に大きく依存している既存の C# [すべての WinForms here ] アプリがあります。SQL の開発とテストに使用できる SQL エディターとライブラリを提供するよう (クライアントから) 依頼されましたが、これを使用してメイン アプリケーションに直接貼り付けることもできます。新しい SQLEditor は、TSQL を解析して実行するマルチスレッド アプリケーションです。ここで、考慮すべきことがいくつかあります。この 2 番目のアプリケーションをメイン アプリケーションから起動する最良の方法は何ですか::

  1. 2 番目のアプリを DLL にしてメイン プロジェクトにロードし、2 番目のアプリを新しいフォーム (SqlEditor sqlEd = new SqlEditor()など) として呼び出しますか? [STAThread]両方のマルチスレッドアプリを同時に利用可能にしてアクティブにしたいので、スレッドの衝撃に関する意味は何ですか?

  2. メイン アプリケーションとは別の .exe として起動するには?

あなたのアドバイスに応じて; 上記のいずれかの場合 - 2 番目のアプリケーションのクリック イベントからメイン アプリケーションに情報を戻す最良の方法は何ApplicationDomainsですか? Observer の設計パターンはここで機能しますか?

この質問をもう少し魅力的にするために、SQL エディターを次に示します。

編集者

選択した SQL をメイン アプリケーションに貼り付けるボタンを用意する予定です。

また、ここに複数の質問があることも承知しており、申し訳ありません。ありがとうございました。

4

3 に答える 3

4

2つのWinFormsアプリケーションのoutproc通信を行う簡単な方法が必要な場合はClipboard、カスタム形式でを使用してみませんか?

ソースアプリケーションの場合:

    // copy the data to the clipboard in a custom format
    Clipboard.SetData( "custom", "foo" );

宛先アプリケーションで、クリップボードをピークするタイマーを作成します。

    private void timer1_Tick( object sender, EventArgs e )
    {
        // peek the data of a custom type
        object o = Clipboard.GetData( "custom" );
        if ( o != null )
        {
            // do whatever you want with the data
            textBox1.Text = o.ToString();
            // clear the clipboard
            Clipboard.Clear();
        }
    }

これはあなたのニーズに合うはずです、そしてそれは重いoutproc通信メカニズムを必要としないのでそれはまだ本当に簡単です。

于 2012-12-06T11:58:17.147 に答える
4

アプリ内通信を実現するもう 1 つの方法は、Windows メッセージを使用することです。グローバル Windows メッセージ ID を定義し、SendMessage や PostMessage などの Windows API 呼び出しを使用します。

その方法を説明する簡単な記事を次に示します 。Ryan Farley の記事「Communication between applications via Windows Messages」

これは事実上、オブザーバー パターンであり、現在の Window に向けられたすべての Windows メッセージを受信し、リッスンしているメッセージを選択します。

私の経験では、これはクリップボードのアプローチよりも間違いなく不安定ではありません。

于 2012-12-06T12:11:45.847 に答える
3

IPC(プロセス間通信)には、メールスロット、NamedPipe、メモリマップトファイル、ソケット、Windowsメッセージング、COMオブジェクト、リモート処理、WCFなどの複数の選択肢があります... http://msdn.microsoft.com/en-us/ library / windows / desktop / aa365574(v = vs.85).aspx http://en.wikipedia.org/wiki/Inter-process_communication

それらのいくつかは双方向通信を提供し、いくつかはシステムセキュリティについて考慮する必要があります(アンチウイルスとファイアウォールの制限、それらの設定の例外としてアプリケーションを追加する必要があります)。

WM_COPYDATAを介したメッセージの送信は、SendMessageだけで実行できます。PostMessageはサポートされていません。これは、通信が同期していることを意味します。

outprocシングルトンCOMオブジェクトの使用は別の方法であり、他の方法や両方のアプリほど単純ではありません。同じCOMオブジェクトにアクセスするには、同じセキュリティコンテキストで実行する必要があります。

別のアプリケーションを起動すると、渡すことができる通信方法やデータの種類にいくつかの制限がありますが、それらを分離すると、障害から保護されます(アプリのクラッシュによって他のアプリケーションが閉じられることはありません)。

2つの部分が常に同じPCで実行される場合、それらの1つをdll[inproc]として使用する方が簡単です。ソケット、リモーティング、WCFなどの他の手法を使用すると、通信の柔軟性が向上します。つまり、2つの部分をわずかな変更を加えるだけで異なるPCで実行できます...

于 2012-12-06T19:15:55.077 に答える