Solved

Can't remove Visual Basic 2008 DLL From memory

Posted on 2011-09-06
5
188 Views
Last Modified: 2012-05-12
I created a Visual Basic DLL using Visual Studio 2008. I have referenced this DLL in a windows form. After I use it I want to dispoase of it. I set it to nothing. But when I use it again, it retained its memory values. This tells me it was not actually removed from memory.

Here is my code:
 
dim objNewCustomer as new WebToMacDll.clsMain
With objNewCustomer
      .RequestNameString = "NEWCUSTOMER"
      .TableIDNoLong = 5
      .ProcessThisRequest()
      StatusMessageString = .StatusMessaageString
End With
objNewCustomer = nothing
'

Open in new window


When I call this code a second time, all the variables have retained their previous values. If the objNewCustomer = Nothing would have removed it from memory, I believe the variable would have all been empty.

How do I remove the DLL from memory after calling it?

Thanks,
pat
0
Comment
Question by:mpdillon
  • 3
  • 2
5 Comments
 

Author Comment

by:mpdillon
ID: 36493029
I found this msdn article. MSDN IDisposeable

I thought it would implement a Dispose method. The Class code to my DLL is included below.

 
Option Explicit On
Imports System
Imports System.ComponentModel

<ComClass(clsMain.ClassId, clsMain.InterfaceId, clsMain.EventsId)> _
Public Class clsMain

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "4e2a0632-6659-4cd2-a059-448f7b53b509"
    Public Const InterfaceId As String = "2a8fe9ab-1918-4a65-aca4-cc8502d9a415"
    Public Const EventsId As String = "94481a6c-f43d-4f0f-a82f-18ce7d33c887"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub
    '
    ' A class that implements IDisposable.
    ' By implementing IDisposable, you are announcing that 
    ' instances of this type allocate scarce resources.
    Public Class MyResource
        Implements IDisposable
        ' Pointer to an external unmanaged resource.
        Private handle As IntPtr
        ' Other managed resource this class uses.
        Private component As Component
        ' Track whether Dispose has been called.
        Private disposed As Boolean = False

        ' The class constructor.
        Public Sub New(ByVal handle As IntPtr)
            Me.handle = handle
        End Sub

        ' Implement IDisposable.
        ' Do not make this method virtual.
        ' A derived class should not be able to override this method.
        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            ' This object will be cleaned up by the Dispose method.
            ' Therefore, you should call GC.SupressFinalize to
            ' take this object off the finalization queue 
            ' and prevent finalization code for this object
            ' from executing a second time.
            GC.SuppressFinalize(Me)
        End Sub

        ' Dispose(bool disposing) executes in two distinct scenarios.
        ' If disposing equals true, the method has been called directly
        ' or indirectly by a user's code. Managed and unmanaged resources
        ' can be disposed.
        ' If disposing equals false, the method has been called by the 
        ' runtime from inside the finalizer and you should not reference 
        ' other objects. Only unmanaged resources can be disposed.
        Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
            ' Check to see if Dispose has already been called.
            If Not Me.disposed Then
                ' If disposing equals true, dispose all managed 
                ' and unmanaged resources.
                If disposing Then
                    ' Dispose managed resources.
                    component.Dispose()
                End If

                ' Call the appropriate methods to clean up 
                ' unmanaged resources here.
                ' If disposing is false, 
                ' only the following code is executed.
                CloseHandle(handle)
                handle = IntPtr.Zero

                ' Note disposing has been done.
                disposed = True

            End If
        End Sub

        ' Use interop to call the method necessary  
        ' to clean up the unmanaged resource.
        <System.Runtime.InteropServices.DllImport("Kernel32")> _
        Private Shared Function CloseHandle(ByVal handle As IntPtr) As [Boolean]
        End Function

        ' This finalizer will run only if the Dispose method 
        ' does not get called.
        ' It gives your base class the opportunity to finalize.
        ' Do not provide finalize methods in types derived from this class.
        Protected Overrides Sub Finalize()
            ' Do not re-create Dispose clean-up code here.
            ' Calling Dispose(false) is optimal in terms of
            ' readability and maintainability.
            Dispose(False)
            MyBase.Finalize()
        End Sub
    End Class


    '
    Public Property DebugBoolean() As Boolean
        Get
            Return PublicVariables.DebugBooleanP
        End Get
        Set(ByVal Value As Boolean)
            PublicVariables.DebugBooleanP = Value
        End Set
    End Property

    Public Property OrdNoString() As String
        Get
            Return PublicVariables.OrdNoStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.OrdNoStringP = Value
        End Set
    End Property
    Public Property InvNoString() As String
        Get
            Return PublicVariables.InvNoStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.InvNoStringP = Value
        End Set
    End Property
    Public Property MacCusNoString() As String
        Get
            Return PublicVariables.MacCusNoStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.MacCusNoStringP = Value
        End Set
    End Property
    Public Property MacCusAltAdrCdString() As String
        Get
            Return PublicVariables.MacCusAltAdrCdStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.MacCusAltAdrCdStringP = Value
        End Set
    End Property
    Public Property StatusMessaageString() As String
        Get
            Return PublicVariables.StatusMessaageStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.StatusMessaageStringP = Value
        End Set
    End Property
    Public Property StatusMessaageDescString() As String
        Get
            Return PublicVariables.StatusMessaageStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.StatusMessaageStringP = Value
        End Set
    End Property

    Public Property WSWebLogOnMacCusNo_IDNoLong() As Long
        'This is WSWebLogonMacCusNo.IDNo
        Get
            Return PublicVariables.WSWebLogOnMacCusNo_IDNoLongP
        End Get
        Set(ByVal Value As Long)
            PublicVariables.WSWebLogOnMacCusNo_IDNoLongP = Value
        End Set
    End Property
    '

    Public Property WSWebLogOn_IDNoLong() As Long
        'This is WSWebLogonMacCusNo.IDNo
        Get
            Return PublicVariables.WSWebLogOn_IDNoLongP
        End Get
        Set(ByVal Value As Long)
            PublicVariables.WSWebLogOn_IDNoLongP = Value
        End Set
    End Property
    Public Property WSWebMacAltAddr_IDNoLong() As Long
        'This is WSWebLogonMacCusNo.IDNo
        Get
            Return PublicVariables.WSWebMacAltAddr_IDNoP
        End Get
        Set(ByVal Value As Long)
            PublicVariables.WSWebMacAltAddr_IDNoP = Value
        End Set
    End Property
    Public Property RequestNameString() As String
        Get
            Return PublicVariables.RequestNameStringP
        End Get
        Set(ByVal Value As String)
            PublicVariables.RequestNameStringP = Value
        End Set
    End Property
    Public Property TableIDNoLong() As Long
        Get
            Return PublicVariables.TableIDNoLongP
        End Get
        Set(ByVal Value As Long)
            PublicVariables.TableIDNoLongP = Value
        End Set
    End Property
    Public Sub ProcessThisRequest()
        PublicVariables.CancelBooleanP = False
        PublicVariables.StatusMessaageDescStringP = ""
        PublicVariables.ParmStringP = ""
        PublicVariables.StatusMessaageDescStringP = ""
        PublicVariables.StatusMessaageStringP = ""
        modMain.BeginProcessingThisRequest()
        PublicVariables.CancelBooleanP = False

    End Sub
End Class

Open in new window


I aplogize for the length. I included everything rather than leave something out.

In my calling program, I can see with Intelisense the MyResource class. But I see the Dispose method.

So I am still stuck.
0
 

Author Comment

by:mpdillon
ID: 36493033
Correction.

"But I see the Dispose method"

should read

But I CANNOT see the Dispose method
0
 
LVL 15

Expert Comment

by:Minh Võ Công
ID: 36493052
0
 
LVL 15

Accepted Solution

by:
Minh Võ Công earned 500 total points
ID: 36493063
0
 

Author Comment

by:mpdillon
ID: 36493230
minhvc,
Thanks for the articles. The first two seem to have some relevance. But why did you post the third link to a music site?

LIke the poster in the second article, I am new to this. So please go slow. It looks like the solution would be to create an AppDomain for the DLL. Is that correct? Since I created the DLL in Visual Studio 2008 (VB) it is managed code correct?

If I created an AppDomain in my Visual Studio testing program, I would be able to add and remove the DLL from memory when ever I wanted. However my Testing program is just that, a TESTING program. The DLL is used by a PHP web server.

I guess I should rephrase the question. What changes do I need to make to my Visual Studio DLL so that it can be called and later removed by a PHP program? I am assuming they do not have access to the AppDomain functionality.

This was fairly simple to do in VB 6. It was handled with Instancing. It can't be this complicated in Visual Studio. I feel I must be missing something very basic (no pun intended).
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

The object model of .Net can be overwhelming at times – so overwhelming that quite trivial tasks often take hours of research. In this case, the task at hand was to populate the datagrid from SQL Server database in Visual Studio 2008 Windows applica…
In my previous article (http://www.experts-exchange.com/Programming/Languages/.NET/.NET_Framework_3.x/A_4362-Serialization-in-NET-1.html) we saw the basics of serialization and how types/objects can be serialized to Binary format. In this blog we wi…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now