CodeFlowCodeFlowデリゲートの問題20デリゲートの問題これは、Cコードからアンマネージ関数を呼び出すために作成しました。pCallbackは関数ポインターであるため、管理対象側はデリゲートです。Answer3メッセージを理解している限り、次のようにする必要があります。(...)}source3アンマネージコードが呼び出したい限り、変数が存在し続け、コールバック関数を参照するように、cbのスコープを拡張する必要があると思います。アンマネージコードは.NET参照の追跡に参加しないため、コールバックへの参照を.NETコードに保持しなければ、フレームワークによって解放され、アンマネージコードはその後適切に呼び出すことができませんそれ。source2デリゲートの型宣言とデリゲートのインスタンスを混同しています。はい、デリゲート宣言を公開しましたが、それは間違っていました。Form1クラスのみがそれを使用します。プライベートでなければなりません。ここで重要なのはデリゲートのインスタンスであり、新しいステートメントで作成したものです。現時点では、インスタンスをForm1コンストラクターのローカル変数に格納しています。これにより、インスタンスの参照が数マイクロ秒保持されます。コンストラクターが完了するとすぐに、その参照はなくなり、ガベージコレクターはその後いつでもデリゲートインスタンスを収集できます。アンマネージコードがそれへの参照を保持していることがわかりません。コレクターは、マネージコードが保持している参照のみを検出できます。アンマネージコードが収集されたデリゲートインスタンスでコールバックを呼び出すと、何も起こりません。大きなカブームが聞こえます。インスタンスへの管理参照があるようにコードを変更する必要があります。これを行う簡単な方法の1つは、インスタンスを格納するプライベートメンバーをForm1クラスに追加することです。十分ではないかもしれませんが、Form1オブジェクトは将来のある時点でガベージコレクションされます。デリゲートオブジェクトも収集します。アンマネージコードが発生した後にコールバックを使用できないことを確認する必要があります。クラスの名前(Form1)が与えられると、この特定のケースでは起こりそうにありません。防御的にコーディングし、フォームのFormClosingイベントハンドラーでコールバックをリセットする呼び出しを行います。