I have just started to migrate some code from VBA to VB.Net. So I am an absolute beginner in VB.Net – but I want to do things right. Maybe some of my questions are stupid but I guess that is because I am a beginner.
So as a first exercise I have developed my first piece of code (see below). Now I thought I have to release ALL COM objects again. Two of them throw errors already while writing the code. And others throw errors at runtime.
But the funny thing is: Weather I release the rest of the COM objects or not (by making the relevant not yet commented lines of Marshal.Release to comments as well – then all lines starting with Marshal.Release are comment lines) the behavior of the code is absolutely the same to my eyes.
Can anybody tell me where I can see/find the difference?
The internet tells me that there must be a difference? But I guess I just don’t understand (till now).
Besides this many more questions are in my head:
- Does every “Dim” statement create a COM Object - that has to be released later on?
- If not how do I detect whether a COM object has been created or not? Which “Dim” statements create COM object and which don't?
- In this example: Dim ActiveWindow As Object = Nothing Try ActiveWindow = Me.HostApplication.ActiveWindow() Catch End Try
Is
Marshal.ReleaseComObject(ActiveWindow) 
identical to 
Marshal.ReleaseComObject(Me.HostApplication.ActiveWindow())?
- According to this:
http://www.codeproject.com/Tips/235230/Proper-Way-of-Releasing-COM-Objects-in-NET
Would it not be better to release each "level" separately like this:
Marshal.ReleaseComObject(Me.HostApplication.ActiveWindow())
Marshal.ReleaseComObject(Me.HostApplication)
Marshal.ReleaseComObject(Me)
- Overall: Am I trying to release too much? Or is it correct / good practie? 
- And what does "GC.Collect()" and "… = Null" have to do with all this? I have not used it at all. Should I better use it? Why? ( "... = Null" I have seen here: 
http://www.codeproject.com/Tips/162691/Proper-Way-of-Releasing-COM-Objects-in-NET)
- Why do I get “ShapeCount was not declared …” - Error if I try to do “ - Marshal.ReleaseComObject(ShapeCount)”? The same with “ShRange”. I think these are COM objects as well?!?
- How do I notice when is the best time to release the COM object again? When I process/debug my code step by step with F11 will it be possible for me to determine the best (soonest) point of release? So far I have no “feeling” about when the COM object is not needed anymore and I can release it. 
Any help and explanations very welcome.
Here is the code I am talking about:
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports System.Windows.Forms
Imports AddinExpress.MSO
Imports PowerPoint = Microsoft.Office.Interop.PowerPoint
'Add-in Express Add-in Module
<GuidAttribute("D75C609E-7632-400F-8A6F-6A6E6E744E75"),
ProgIdAttribute("MyAddin8.AddinModule")> _
Public Class AddinModule
Inherits AddinExpress.MSO.ADXAddinModule
#Region " Add-in Express automatic code "
[…] 
#End Region
Public Shared Shadows ReadOnly Property CurrentInstance() As AddinModule
    Get
        Return CType(AddinExpress.MSO.ADXAddinModule.CurrentInstance, AddinModule)
    End Get
End Property
Public ReadOnly Property PowerPointApp() As PowerPoint._Application
    Get
        Return CType(HostApplication, PowerPoint._Application)
    End Get
End Property
Private Sub AdxRibbonButton2_OnClick(sender As Object, control As IRibbonControl, pressed As Boolean) Handles AdxRibbonButton2.OnClick
    MsgBox(GetInfoString2())
End Sub
Friend Function GetInfoString2() As String
    Dim ActiveWindow As Object = Nothing
    Try
        ActiveWindow = Me.HostApplication.ActiveWindow()
    Catch
    End Try
    Dim Result As String = "No document window found!"
    If Not ActiveWindow Is Nothing Then
        Select Case Me.HostType
            Case ADXOfficeHostApp.ohaPowerPoint
                Dim Selection As PowerPoint.Selection =
                    CType(ActiveWindow, PowerPoint.DocumentWindow).Selection
                Dim WindowViewType As PowerPoint.PpViewType = PowerPoint.PpViewType.ppViewNormal
                Dim SlideRange As PowerPoint.SlideRange = Selection.SlideRange
                Dim SlideCountString = SlideRange.Count.ToString()
                If WindowViewType = 9 And SlideCountString < 2 Then
                    Dim ShRange As PowerPoint.ShapeRange = Nothing
                    Try
                        ShRange = Selection.ShapeRange
                    Catch
                    End Try
                    If Not ShRange Is Nothing Then
                        Dim ShapeCount = ShRange.Count.ToString()
                        Result = "You have " + ShapeCount _
                            + " shapes selected."
                    Else
                        Result = "You have 0 shapes selected."
                    End If
                End If
                'Marshal.ReleaseComObject(ShapeCount)
                'Marshal.ReleaseComObject(ShRange)
                'Marshal.ReleaseComObject(WindowViewType)
                'Marshal.ReleaseComObject(SlideCountString)
                Marshal.ReleaseComObject(SlideRange)
                Marshal.ReleaseComObject(Selection)
            Case Else
                Result = AddinName + " doesn't support " + HostName
        End Select
        'Marshal.ReleaseComObject(Me.HostType)
        'Marshal.ReleaseComObject(Result)
        Marshal.ReleaseComObject(Me.HostApplication.ActiveWindow())
        Marshal.ReleaseComObject(Me.HostApplication)
        'Marshal.ReleaseComObject(Me)
    End If
    Return Result
End Function
End Class
 
     
    