掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB.net DLLのメモリリークについて (ID:143368)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
何度もご指導ありがとうございます。 >(1) COM 化することなく、単に Ping.SendAsync を繰り返した場合 DLLではなく.netアプリとして行うということでしょうか? それであればメモリリークするようです >(2) 何もしない DLL を作り、それをVB6から繰り返し呼び出した場合 メモリリークはありませんでした。 >(3) Ping クラスを生成するだけで、SendAsnyc を呼ばなかった場合 メモリリークはありませんでした。 >(4) WM_USER_PING メッセージ交換のみで Ping を実行しない DLL とした場合 メモリリークはありませんでした。 >作成された DLL は イベントを公開していないようなので、 これの意味がわかりませんでした。 公開とはどのようなことですか? なにか公開するとメリットがあったり・公開すると別の対策や方法が生まれてくるという方法があるのでしょうか? >PingCompleted イベントを抜けた後のタイミング ということなのでDLL側は下記の通りしてみました。 ****当初のソース内Ping関数一部抜粋***** <★前半省略★> 'Pingで送信する32バイトのデータを作成 Dim bs As Byte() = System.Text.Encoding.ASCII.GetBytes(New String("A"c, 32)) 'タイムアウトを10秒 mainPing.SendAsync(add, 10000, bs, opts, Nothing) opts = Nothing bs = Nothing Return True End Get End Property Private Sub Ping_PingCompleted(ByVal sender As Object, _ ByVal e As System.Net.NetworkInformation.PingCompletedEventArgs) Dim Ret As Integer If e.Cancelled Then Ret = PostMessageStr(Val_hd, WM_USER_PING, 1, 2) ElseIf Not (e.Error Is Nothing) Then Ret = PostMessageStr(Val_hd, WM_USER_PING, 1, 1) Else '結果を取得 If e.Reply.Status = System.Net.NetworkInformation.IPStatus.Success Then Ret = PostMessageStr(Val_hd, WM_USER_PING, 1, 7) Else Ret = PostMessageStr(Val_hd, WM_USER_PING, 1, 3) End If End If DirectCast(mainPing, System.IDisposable).Dispose() ←★追加しました End Sub VB6側をもっとシンプルに Private Sub Timer1_Timer() On Error GoTo Err_Proc Dim obj As Netchk.Netchk Dim ret As Long Set obj = New Netchk.Netchk ret = obj.ping("192.168.0.1", Me.hWnd) Err_Proc: End Sub のみのシンプルなフォームを作り試験をしてみました。(postmassege受信処理は作っていません) VB6側、DLL側いかがでしょうか? DirectCastのおかげか80kのメモリ浪費はなくなりました。落ちることもないのでその件はまた別の問題にようでした。 いまこのシンプルな試験フォームではタイマーイベント毎に8k増加しつづけているようです。 これが普通のことなのかどうかもわかりませんし時間が経過していないためどこかで上限以上消費しないのか無尽蔵に消費するのかはまだわかりません。 あとはVB2010にすると解消する等のことも考えられますか?
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.