- PR -

オブジェクトの開放について

1
投稿者投稿内容
ちびぐま
常連さん
会議室デビュー日: 2004/09/09
投稿数: 37
お住まい・勤務地: 横浜市
投稿日時: 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関数が実行されるのかがわからない状態です。

宜しくお願い致します。
Hirotate
会議室デビュー日: 2004/04/05
投稿数: 15
投稿日時: 2004-11-25 21:27
私はVB6.0のActiveXDLLをやったことがないのでなんとも言えないですが、
Nothingを代入したタイミングでは、ガベージコレクションは行われないという事だけはわかります。
GC.ReRegisterForFinalizeはSuppressFinalizeしたオブジェクトに対して行うものなので、
ちょっと使い方が違うかも。
開放を強制するには、GC.Collectメソッドがあります。
これで、COMのラッパーが開放され、参照カウンタがデクリメントされれば、
ActiveXDLLも多分、開放されると思います。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-11-26 00:12
引用:

dim _Dll as AcviteXDLL
set _Dll = new AcviteXDLL
・・・・・
_Dll = Nothing

と記述しているのですが、_Dllオブジェクトが開放できないでいます。
開放できないというのはNothingをしているにもかかわらず、
AcviteXDLLのClass_Terminate関数が実行されません。



VB.NET では、Nothing の代入によって、即座に COM オブジェクトの解放が行われることはありません。

コード:
dim _Dll as AcviteXDLL 
set _Dll = new AcviteXDLL 
・・・・・ 
System.Runtime.InteropServices.Marshal.ReleaseComObjec (_Dll)



とすれば、解放されます。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Hirotate
会議室デビュー日: 2004/04/05
投稿数: 15
投稿日時: 2004-11-26 09:18
引用:


コード:
System.Runtime.InteropServices.Marshal.ReleaseComObjec (_Dll)






COMを解放するにはこうすればいいんですね。
今まで、怪しいとは思いつつ、GC.Collectでやってました。
勉強になります。
1

スキルアップ/キャリアアップ(JOB@IT)