System::Windows::Forms::UserControl のサブクラスがあります。これは、デストラクタで解放する必要があるアンマネージ リソースを割り当てます。WindowsFormsHost を介して WPF アプリケーションで使用されます。コントロールがアプリケーションで少なくとも 1 回表示される場合、そのデストラクタが呼び出されます。ただし、コントロールのインスタンスが作成されても表示されない場合は、ファイナライザーのみが呼び出されます。
なぜそれが起こるのですか?
IDisposable::Dispose() を呼び出すと、~destructor が呼び出されます。これはオプションの呼び出しであり、他のコードで明示的に行う必要があります。コントロールをコンテナー (フォームやパネルなど) の Controls コレクションに追加すると、コンテナーが適切に破棄されます。一般に、ユーザーが閉じるボタンをクリックしてウィンドウを閉じると、これは自動的に行われます。
その「自動」が機能しないシナリオがたくさんあります。悪名高いのは、Controls::Remove/At() または Controls::Clear() メソッドを呼び出して自分でコントロールを削除する場合です。gcnew を使用してインスタンスを作成したばかりで、コンテナー コントロールに追加して実際に表示したことがない場合は、確かに自動ではありません。ControlsCollection クラスはその仕事をすることができません。
オプションの呼び出しは、保証された呼び出しによってバックアップされる必要があります。アンマネージ リソースを解放する必要がある場合は、常に!finalizer を実装する必要があります。したがって、コントロールを使用するコードがオプションの呼び出しをスキップしても、何らかの理由でそれらがリークされることはありません。その !finalizerは、すぐ後に呼び出されます。
CLI クラス ラッパーIDisposable
はデフォルトで実装されます。インスタンスを呼び出さない場合MyCLIClass::Dispose()
、デストラクタは呼び出されません。私は WPF の専門家ではありませんが、コントロールを表示するときは、コントロールの破棄を処理する他のクラスへの参照を渡す必要があります。そうしないと、呼び出されません。