あなたの質問から、あなたのネイティブ コレクションはネイティブ コード (ネイティブ c++ のみを使用するライブラリ、名前空間など) のどこかにあると思います。 .net コレクションの 1 つを使用しないのはなぜですか?
私の仮定が正しく、コレクションがネイティブ コードにある場合、この通信を直接行う方法がわかりません。私はしばらく C++/CLI でプログラミングしていますが、.Net コードが反応するネイティブ コードで「イベント」を作成する方法がわかりませんでした。
しかし、ほぼイベントとして機能するオブザーバーパターンまたは類似のものを使用することをお勧めします。observer
プロジェクト全体でネイティブ コードと .Net コードを混在させないために、.Net コードを取り込まずにネイティブ コード ( your ) で使用できる特別なオブザーバー クラス ( your ) を作成することをお勧めしsubject
ます。また、.Net コード (あなたのwinForm
) を認識し、両方の間の通信を行います。このオブザーバーは、コレクションのサイズが変更されたときにネイティブ コードのサブジェクトから通知を受け、winForm
.
対話ネイティブ c++ <-> c++/CLI に関する追加情報 (以下のコメントを参照):
.Net 参照をネイティブ コードに格納するのは簡単なことではないため、追加のオブザーバー クラスを使用して相互作用をカプセル化することをお勧めします。winform
あなたの場合、これはオブザーバークラスとして直接実装しようとしないことを意味します。サブジェクト クラスとの間に追加のネイティブ オブザーバー クラスを使用するとwinForm
、オブザーバーを簡単に登録でき、このクラスにのみマネージド参照を格納するという問題が発生します。次の 2 つのオプションがあります。
フォームの生きているインスタンスへの参照を取得するためのシングルトン パターンを実装します。winForm
参照は、通常どおり一時的に保存できますType^
。これを使用して、通知メソッドで参照を取得できます。
ネイティブ オブザーバー クラスを実装し、gcrootを使用して参照を最初から格納します。この場合、いくつかのキャストを行う必要があるかもしれません。
どちらの場合も、notify メソッドで、winForm
必要な処理をコレクションに対して実行する の public メソッドを呼び出します。また、.Net Framework への参照は、このオブザーバー クラスを含むプロジェクト用にセットアップする必要があります (すべてのクラスが と同じプロジェクトにある場合は、既に完了している必要がありますwinForm
)。