4

グローバルな Windows イベントをフックするために C dll を使用しています。次のステップは、C# アプリケーションにいくつかのイベント データ (巨大なものではない) を送信することです。

この通信をできるだけ高速にしたいので、名前付きパイプとメモリ マップ ファイルの 2 つのオプションを分析しています。

.NET 4 が MMF をネイティブな方法で提供することは知っていますが、Win98 クライアントがまだ存在する可能性があるため、.NET 2 をターゲットにする必要があります。また、Windows API を介して .NET 2 で MMF を管理する方法があることも知っています (また、いくつかのラッパーを作成した人もいます)。

この文脈で、私は知りたいです:

  1. MMF の代わりに名前付きパイプを選択することに大きな欠点 (主にパフォーマンス) はありますか? 大量のデータを転送しないことを覚えておくことが重要です。
  2. NP または MMF (.NET 2 を対象) に関連するセキュリティ上の問題はありますか?
  3. それらよりも良い選択肢はありますか?
4

3 に答える 3

2

ターゲット アプリケーションにメッセージを送信できるウィンドウがあり、送信するデータの量が比較的少ない場合は、WM_COPYDATA メッセージを使用して情報を渡すことを検討してください。

このメッセージは、単純なプロセス間通信 (ターゲットに GUI がある場合) 用に設計されており、ネイティブ アプリケーションまたは .NET アプリケーションでほとんど労力をかけずに使用できます。渡すデータを作成することでメモリを解放し、Windows 95 以降のすべての Windows システムで利用できます。

http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx

于 2010-01-17T19:04:25.463 に答える
1

オプション 1: C# オブジェクトの 1 つで COM インターフェイスを公開し、C++ アプリケーションからそれを呼び出します。

オプション 2: C++/CLI を使用する - Win32 API を使用してグローバル Windows イベントをフックし、反対側で .Net クラスを公開して、C# クライアントが直接使用できるようにします。

もちろん、これらのオプションのどちらも、名前付きパイプとメモリ マップ ファイルに関する質問には答えませんが、これらを個別のプロセスとして保持する特別な必要がない限り、これらのいずれかがより簡単になると思います。

于 2010-01-06T16:13:23.073 に答える
0

MMF は使ったことがないのでよくわかりませんが、見た目からすると設定が複雑すぎるように見えます。P/invokes をラップした後、Named Pipes を .NET 2.0 のストリームとして公開できるようにする (私は 3.5 System.Core クラスのそっくりさんを作成しました)、データのパケットをどちらの方法でも送信するのは非常に簡単です。アクセス許可を設定して、Vista/7 のより制限的なポリシーで動作させることができる場合。

おそらく、C# アプリケーションにサーバー ストリームを用意し、ネイティブ コードでクライアントの可能な無数のインスタンスを作成したほうがよいでしょう (すべてのクライアントとフックする前に開始された単一のインスタンスを共有できるかどうかはわかりません)。 dll を注入するプロセスなので、複数のクライアントを持つことになると思います)。

そのため、Vista/7 の DLL フックを完全にあきらめました。

于 2010-01-28T14:31:03.097 に答える