22

C# で記述された 2 つのアプリケーションがあるとします。1 つ目は、「OnEmailSent」と呼ばれるイベントを発生させるサードパーティ アプリケーションです。

2つ目は、1つ目のアプリの「OnEmailSent」でもなんとか購読したいという思いで書いたカスタムアプリです。

「OnEmailSent」イベントをリッスンする最初のアプリケーションのインスタンスに 2 番目のアプリケーションをアタッチする方法はありますか?


さらに明確にするために、私の具体的なシナリオは、"OnEmailSent" イベントを発生させる c# で記述されたカスタム サード パーティ アプリケーションがあるというものです。リフレクターを使用してイベントが存在することを確認できます。

やりたいことは、このコンポーネントが電子メールを送信するときに他のアクションを実行することです。

私たちが考えることができる最も効率的な方法は、anders が提案したように、何らかの形式の IPC を使用して、サードパーティ コンポーネントによって発生する OnEmailSent イベントをリッスンできるようにすることです。

コンポーネントは C# で記述されているため、実行中のプロセスにアタッチできる別の C# アプリケーションを記述し、OnEmailSent イベントが発生したことを検出すると、独自のイベント処理コードを実行するというアイデアをいじっています。


私は何かが欠けているかもしれませんが、リモーティングがどのように機能するかについて私が理解していることから、クライアントがサブスクライブできるある種のコントラクトを定義するサーバーが必要になるということです。

たとえば、誰かが別のアプリケーションからサブスクライブしたいイベントを公開する Outlook のようなスタンドアロン アプリケーションを作成したシナリオについて考えていました。

私が考えているシナリオは、.net デバッガーと、実行中のアセンブリにアタッチして、実行中にコードを検査する方法だと思います。

4

6 に答える 6

14

2 つのアプリケーション (別々のプロセス) がイベントを交換するには、これらのイベントの通信方法について合意する必要があります。これを行うにはさまざまな方法があり、どの方法を使用するかは、アーキテクチャとコンテキストによって異なります。この種のプロセス間の情報交換の一般的な用語は、プロセス間通信 (IPC)です。IPC には多くの標準的な方法があり、最も一般的な方法は、ファイル、パイプ、(ネットワーク) ソケット、リモート プロシージャ コール (RPC)、および共有メモリです。Windows では、ウィンドウ メッセージを使用することも一般的です。

これが Windows 上の .NET/C# アプリケーションでどのように機能するかはわかりませんが、ネイティブの Win32 アプリケーションでは、外部プロセスのメッセージ ループにフックして、それらが送信しているメッセージを「スパイ」できます。目的の関数が呼び出されたときにプログラムがメッセージ イベントを生成する場合、これはそれを検出する方法である可能性があります。

両方のアプリケーションを自分で実装する場合は、好みの IPC 方法を使用することを選択できます。ネットワーク ソケットと、HTTP、XML-RPC、SOAP などの高レベルのソケット ベースのプロトコルは、さまざまな物理マシンでアプリケーションを実行できるため (ネットワーク経由で接続されている場合)、最近非常に人気があります。

于 2008-08-20T13:44:10.607 に答える
3

Managed Spyを試すことができ、プログラムによるアクセスのためにManagedSpyLib

ManagedSpyLib には、ControlProxy というクラスが導入されています。ControlProxy は、別のプロセスにおける System.Windows.Forms.Control の表現です。ControlProxy を使用すると、宛先プロセス内で実行しているかのように、プロパティを取得または設定し、イベントをサブスクライブできます。自動化テスト、互換性のためのイベント ログ、クロス プロセス通信、またはホワイトボックス テストには ManagedSpyLib を使用します。

しかし、これはあなたにとってはうまくいかないかもしれません.ControlProxyがサードパーティアプリケーション内であなたが求めているイベントに何らかの方法でアクセスできるかどうかによって異なります.

Reflexilを使用することもできます

Reflexil では、Jb EVAIN によって作成された強力な Mono.Cecil ライブラリを使用して IL を変更できます。Reflexil は Reflector プラグインとして実行され、特に IL コードの処理に向けられています。これは、完全な命令エディターを提案し、C#/VB.NET コード インジェクションを許可することによって実現されます。

于 2008-08-20T13:12:46.563 に答える
1

リモート処理または WCF を使用できます。http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7を参照してください。

于 2008-08-20T13:07:15.017 に答える
0

そのサード パーティ アプリケーションからの OnEmailSent イベントの性質は何ですか? つまり、アプリケーションがそのようなイベントをトリガーしていることをどうやって知るのでしょうか?

プロセス間通信を計画している場合、最初に自問する必要があるのは、「それは本当に必要なのか?」ということです。

動機に疑問の余地はありませんが、本当にプロセス間通信を行う必要がある場合は、何らかのメカニズムが必要になります。リストは非常に長いです。単純な WM_DATA メッセージからカスタム TCP プロトコル、追加のインフラストラクチャを必要とする非常に複雑な Web サービスまで。

これにより、正確に何をしようとしているのかという疑問が生じます。あなたが制御できないこのサードパーティのアプリケーションは何ですか?

また、デバッガーには、プロセスをデバッグするための非常に侵入的な方法があります。これが他のすべてのアプリケーションで使用される標準のプロセス間メカニズムであるとは思わないでください。実際のところ、そうではありません。

于 2008-08-20T13:21:01.957 に答える
0

データベース内のデータが変更されるまでブロックする .NET アプリケーションで永続的な SqlConnection を維持することにより、SQL Server 2005 クエリ変更通知で同様のシナリオを実装できます。

http://www.code-magazine.com/article.aspx?quickid=0605061を参照してください。

于 2008-08-20T13:30:23.573 に答える