2009-05-14 9 views
0

アンマネージドC++にCOMコンポーネントを作成して、顧客にデータベースへのアクセスを提供しました。アンマネージ言語から使用する場合、データベース接続はオブジェクトがスコープ外になると正しくクリーンアップされます。私は最近VB.NETからの使用を試み、COMオブジェクトが破壊されていないことを発見しました。 System.Runtime.InteropServices.Marshal.ReleaseComObjectへのスキャッタリングは問題を修正しますが、このCOMオブジェクトは顧客用に設計されているため、よりシンプルで例外的な安全ソリューションを探したいと思います。COMオブジェクトでDisposeを実装する方法

正しい解決策は、管理対象オブジェクトが自動的にオブジェクトがもはや必要としない場合廃棄を呼び出し、使用することができ文を使用してIDisposeableので実装持つことであることが表示されます。

オブジェクトのサブセットに対してIDisposeableを実装するにはどうすればよいですか?処分を必要とするオブジェクトのいくつかは、共同作成可能ではなく、他の関数によって返されます。

+0

おそらく、この質問に対する私の答え(http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop -objects-in-c/158752#158752)は、特定のケースで役立ちます。 – VVS

答えて

2

狂気はそうです。 IDisposableを実装している型の安全な.Netラッパー(必要に応じて)でCOMオブジェクトをラッピングする方が良いでしょう。また、.NETガベージコレクションの通常のメソッドを使用して自分自身を整理することもできます。

+0

IDisposableを使用する以外にデータベース接続が確実に閉じられるようにする方法がありますか? COMコンポーネント内のキャッシュがDllMainで破棄されると、現在クラッシュが発生しているため、すべてのCOMオブジェクトがクリーンアップされていることを確認したいと思います。 COMオブジェクトが解放された場合、キャッシュは空になります。 –

2

1800 INFORMATIONが示唆するようにあなたが言ったように、常にusingステートメントでそれらを使用することを覚えて、その後、.NETラッパーで行くことができる:

using(var connection = GetDisposableConnection()) 
{ 
    //do stuff 
} 

何かがされていなかったので、これは動作しない場合シャットダウン時に正しく解放、あなたはこれらの行を挿入することができます。

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
+0

WaitForPendingFinalizersを呼び出すヒントをいただき、ありがとうございました。 –

+0

問題ありません - 喜んで助けてください。 – Ant

関連する問題