- - PR -
オブジェクトの開放について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-25 18:57
お世話になっております。
VB.NET、AcviteXDLL(VB6.0で作成)でWeb開発をしています。 AcviteXDLLを.NETの参照設定で取り込んで使用しております。 ボタンをクリックするとAcviteXDLLの処理を実行し、結果表示画面に遷移するようなことをしております。 dim _Dll as AcviteXDLL set _Dll = new AcviteXDLL ・・・・・ _Dll = Nothing と記述しているのですが、_Dllオブジェクトが開放できないでいます。 開放できないというのはNothingをしているにもかかわらず、 AcviteXDLLのClass_Terminate関数が実行されません。 そのためAcviteXDLLで使用したメモリが開放できないでいます。 NothingのかわりにGC.ReRegisterForFinalize(_Dll)としても駄目でした。 オブジェクトを開放する(Class_Terminate関数を実行できる)方法を教えてください。 ちなみにNothingのところではClass_Terminate関数は実行されないのですが、前の画面にもどったときにClass_Terminate関数が実行される場合がありますが毎回実行されるわけではないみたいです。 どういったタイミングでClass_Terminate関数が実行されるのかがわからない状態です。 宜しくお願い致します。 | ||||||||
|
投稿日時: 2004-11-25 21:27
私はVB6.0のActiveXDLLをやったことがないのでなんとも言えないですが、
Nothingを代入したタイミングでは、ガベージコレクションは行われないという事だけはわかります。 GC.ReRegisterForFinalizeはSuppressFinalizeしたオブジェクトに対して行うものなので、 ちょっと使い方が違うかも。 開放を強制するには、GC.Collectメソッドがあります。 これで、COMのラッパーが開放され、参照カウンタがデクリメントされれば、 ActiveXDLLも多分、開放されると思います。 | ||||||||
|
投稿日時: 2004-11-26 00:12
VB.NET では、Nothing の代入によって、即座に COM オブジェクトの解放が行われることはありません。
とすれば、解放されます。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 2004-11-26 09:18
COMを解放するにはこうすればいいんですね。 今まで、怪しいとは思いつつ、GC.Collectでやってました。 勉強になります。 |
1