Programmer's Guide:
Using Custom Extensions

Note: This topic only considers limited scenarios encountered when migrating a single sample extension DBRowValidation.

Updates and Guidelines to Custom Extensions


Follow these guidelines to avoid leaks and/or deadlocks to eRoom Server application:

  • In eRoom sample extension DBRowValidation, read the comment VBNetComEffect that describes the Visual Basic .NET implementation.

  • Use Try-Catch-Finally block in Visual Basic .NET, for better exception and error handling.

  • Visual Basic 6.0 used the On Error Goto and/or On Error Resume Next syntax to handle exceptions at runtime. In this scenario, use Try-Catch-Finally block in Visual Basic .NET.

  • In eRoom sample extension DBRowValidation, the utility function ReleaseComObject internally calls Microsoft API Marshal.ReleaseComObject(). This utility function handles validation before calling Microsoft API and also manages exceptions from Microsoft API.

  • In eRoom sample extension DBRowValidation, the utility function FinalReleaseComObject internally calls Microsoft API Marshal.FinalReleaseComObject(). This Microsoft API releases all COM references recursively, until reference count becomes zero. This function is not used in the eRoom sample code.

  • Passing eRoom COM objects as Argument to function or sub routine. EMC has not found any impact or difference when eRoom COM objects are passed ByVal and/or ByRef as an argument to a function or sub for reference counting.

  • Do not Exit or Break from function, sub, or loop directly without releasing the objects. All eRoom objects that are used locally should be released in during a normal exit or in scenarios with error or exception.

Sample Codes in Visual Basic Code and Visual Basic .NET Code


Simple Object Creation and Release

 

Visual Basic Code:

'# Determine who caused the event by getting ::LoggedinMember property

Dim user As eRoomAPI.IERUUser

Dim user As eRoomAPI.IERUUser

user = pEventInfo.LoggedInMember 'QueryInterface for IERUUser interface

Trace("LoggedInMember DisplayName: " & user.DisplayName)

 

Visual Basic .NET Code:

'# Determine who caused the event by getting ::LoggedinMember property

Dim user As eRoomAPI.IERUUser

user = pEventInfo.LoggedInMember 'QueryInterface for IERUUser interface

Trace("LoggedInMember DisplayName: " & user.DisplayName)

'### Release COM Object once done with it...

’r; Either using MS API directly  

Marshal.ReleaseComObject(user)

’r; OR using Utility Function which intern call MS API with proper validation

ReleaseComObject(user)

 

Parent Child Objects (Scenario 1)

 

Visual Basic Code:

'# Get the database that contains the DBRow

Dim databaseitem As eRoomAPI.IERUItem

databaseitem = dbrowitem.Parent

’r;# To get URL of the item using PrincipalItem &ldots;

Trace("Item URL : " & databaseitem.PrincipalItem.URL)

 

Visual Basic .NET Code:

'# Get the database that contains the DBRow

Dim databaseitem As eRoomAPI.IERUItem

databaseitem = dbrowitem.Parent

'# Create PrincipalItem Object (Child) first and then use it’s URL property.

’r; This way we can Release Child object’s Ref out of Parent Object...

Dim principalItem As eRoomAPI.IERUPrincipalItem

principalItem = databaseitem.PrincipalItem

Trace("Item URL : " & principalItem.URL)

'### Release Child Object first and then Parent once done with them...

ReleaseComObject(principalItem)

ReleaseComObject(databaseitem)

 

Parent Child Objects (Scenario 2)

 

Visual Basic Code:

'# Determine who is logged in member/user

Dim member As eRoomAPI.IERUMember

member = pEventInfo.LoggedInMember

Trace("LoggedInMember Info: " member.User.DisplayName & " (" member.ID & ")")

 

Visual Basic .NET Code:

'# Determine who is logged in member/user

Dim member As eRoomAPI.IERUMember

member = pEventInfo.LoggedInMember

user = member.User

Trace("LoggedInMember: " & user.DisplayName & " (" & member.ID & ")")

ReleaseComObject(user)

ReleaseComObject(member)

 

Accessing Collection of Objects and Loop

Loops are used to iterate through objects that are present in a collection. In this scenario, collection is an object that must be released, and every object added within the collection must be released as well.

 

Visual Basic Code:

Dim dbrow As eRoomAPI.IERUDBRow

'Assuming dbrow is Set appropirately

dbrow = xyzObject

Dim cell As eRoomAPI.IERUDBCell

For Each cell In dbrow.Cells

'Usage of how cell is created within loops

'Some statements to perform the task as per functionality

’r;Plus, child ”r;column” interface is directly accessed... cell.column.Name

Trace "My column Name: " & cell.column.Name

Next cell

 

Visual Basic .NET Code:

Dim dbrow As eRoomAPI.IERUDBRow

'Assuming dbrow is Set appropirately

dbrow = xyzObject

Dim cell As eRoomAPI.IERUDBCell

Dim column As eRoomAPI.IERUDBColumn 'Declare/Create CHILD object first

Dim colCells As eRoomAPI.ERUCollection

colCells = dbrow.Cells

'Iterate through the collection using its count or size

For index = 1 To colCells.Count

'get current item from the collection with current index...

cell = colCells.Item(index)

'Some statements to perform the task as per functionality

' Do not use Parent.Child.Property style ...

’r; Get the Child object Column first

column = cell.Column

Trace ("My column Name: " & column.Name)

' Release call objects used inside loop ...

ReleaseComObject(column)

ReleaseComObject(cell)

Next index

' Releasing Collection Object itself

ReleaseComObject(colCells)

ReleaseComObject(dbrow)

 

Few Observations from the Sample Code

  • Declare and instantiate COM objects just before usage.

  • Release COM objects soon after usage, by using ReleaseComObject().

  • Ensure that you call ReleaseComObject() in the reverse order of object creation.

  • Use Try-Catch-Finally block for better error handling.

  • Do not use collection object directly. Create the collection object individually, so that you can release it independently.

  • Change or modify the method to iterate through collections using loops.

  • Do not exit or break directly from within a loop. Release all object in use, in the reverse order of creation, before exiting the loop.

  • Release every object created or accessed within the loop, at the end of the loop.

Refer to Upgrading Visual Basic 6.0 Applications to Visual Basic .NET on the Microsoft website for more information on Marshal.ReleaseComObject and Garbage Collection.