4

C# で開発されたオブジェクトのセットで構成される as/w アーキテクチャを開発しました。イベントを多用して、ステータスの変化などをクライアントに通知します。

当初の目的は、レガシ コードが COM 相互運用サービスを通じてこれらのマネージ オブジェクトを使用できるようにすることでした。設計仕様書に書くのは簡単だったのですが、実際に実装するのはもっと難しいと思います。このメソッドを使用したイベント処理の良いサンプルを探して、何時間も検索しました。その道をたどる前に、COM 相互運用がレガシ コードから新しいコードを呼び出せるようにする最善の方法であることを確認したいと思います。

いくつかの異なるオプションがあるようです: 1) COM 相互運用、2) アンマネージ ラッパー クラスの作成、3) /clr コンパイラ スイッチを使用したマネージ オブジェクトの呼び出しの有効化、4) ある種の逆 pInvoke 呼び出しの使用。不足していますか?

それぞれのオプションには利点と欠点があり、どの方法が最善かを考えています。それぞれの具体的な質問/コメントはこちら

COM INTEROP - イベント処理がハードルのようです。パラメータとして変数型を持つイベントを使用します。イベント パラメータには、イベント ID とオブジェクトが含まれる場合があります。イベント ID に基づいて、オブジェクトは特定のタイプになります。これは COM 相互運用機能で処理できますか? 公開されているオブジェクトの多くにはプロパティがあります。インターフェイスでプロパティを宣言することはできないため、すべてのプロパティに対応する get/set メソッドが必要になります。

WRITE UNMANAGED WRAPPER - これは、/clr オプションを使用して DLL を作成し、マネージド オブジェクトの作成と呼び出し、およびアンマネージド オブジェクトの公開を許可することを意味すると思います。これらの管理対象外のクライアントでしょうか。私は前にこれをやったことがありません。これの利点/欠点は何ですか?

/CLR スイッチを使用してください - これが管理対象オブジェクトのサポートを追加することを意味することを理解しています。このアプローチの欠点は何ですか? このオプションは、上記のイベントをサポートしていますか? 「これがマネージ ライブラリです。レガシ コードで /clr コンパイラ オプションを使用して、それを実行しますか?」と言えますか? 私はこれの影響を知りません。これがどのように機能するかの良いサンプルはありますか? (確かにあると思いますが、見つけられませんでした)

REVERSE PINVOKE を使用してください - これがどのように機能するか正確にはわかりませんが、私が見つけた限りでは、これはおそらく有効な解決策ではありません。

では、正しい方向を見つけるための決定木はどのように見えるでしょうか? どんな助けでも大歓迎です。

  • DP
4

1 に答える 1

1

あなたの最初の解決策が最良の解決策だと思います。COM 相互運用性は安定しており、十分に文書化されています。必要なのは、特定のイベント ハンドラーからポップアウトする可能性のあるすべての異なるイベント オブジェクトが、同じ COM 可視ベース イベント オブジェクト インターフェイス (イベント タイプ ID などを持つ) を実装していることを確認することだけです。そこから、個々のオブジェクトは、必要なその他のインターフェイスを実装でき、アンマネージ コードは、定義したい基準に基づいて適切な「詳細」インターフェイスの QI を実行できます。それは本当に難しいことではありません。アンマネージ イベント ハンドラーを含むエンド ツー エンドのサンプルについては、このCodeProjectの記事を参照してください。

于 2009-12-14T09:45:43.207 に答える