Quantcast
Channel: SCN: Message List
Viewing all articles
Browse latest Browse all 8581

Re: Release memory after call to .NET COM object via OLE

$
0
0

I'm trying to see if I can duplicate the issue with a small reproducible test case, without success.  Here's what I'm doing.

 

C# Code:

 

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace ReturnArrayDemo
{    [ComVisible(true)]    [Guid("3CF8AB49-5E7D-4719-B277-5047C6A42FAE")]    public interface IReturnArray    {        String getString();        String[] getStringArray();        myClass getClass();        myClass[] getClassArray();    }    [ComVisible(true)]    [Guid("EDA88A40-73BC-4e61-B134-DD07D42E91E0")]    public class myClass    {        [ComVisible(true)]        [MarshalAs(UnmanagedType.BStr)]        public string myString;        [ComVisible(true)]        public int myInt;    }    [ComVisible(true)]    [Guid("8035E886-82F1-47c7-AE7D-087DD0A555CE")]    [ClassInterface(ClassInterfaceType.None)]    public class ReturnArray : IReturnArray    {        public ReturnArray()        {        }        public String getString()        {            return "Hello World";        }        public String[] getStringArray()        {            String[] myArray = new String[2] { "Hello", "World" };            return myArray;        }        public myClass getClass()        {            myClass temp =                new myClass                {                    myString = "Hello",                    myInt = 1                };            return temp;        }        public myClass[] getClassArray()        {            myClass[] myArray =                new myClass[]{                    new myClass(){                        myString = "Hello",                        myInt = 1                    },                    new myClass(){                        myString = "World",                        myInt = 2                    },                    new myClass(){                        myString = "This is Bruce",                        myInt = 3                    }               };            return myArray;        }    }
}

And then using the PowerBuilder Classic code to call it:

 

oleobject      retarray
int                    li_rc
int                    li_index, li_count
int                    li_x
String               ls_string
String               ls_stringarray[]
oleobject          loo_class
oleobject          loo_classarray[]
retarray = CREATE OleObject
li_rc = retarray.ConnectToNewObject ( "ReturnArrayDemo.ReturnArray" )
//ls_string = retarray.getString()
//MessageBox ( "getString", ls_string )
//ls_stringarray = retarray.getStringArray()
//MessageBox ( "getStringArray", ls_stringarray[1] )
//loo_class = retarray.GetClass()
//MessageBox ( "GetClass", String ( loo_class.myString ))
//Destroy loo_class
FOR li_x = 1 TO 10000     loo_classarray = retarray.GetClassArray()     st_1.Text = loo_classarray[1].myString + " Step: " + String ( li_x )     li_count = UpperBound ( loo_classarray )     FOR li_index = li_count TO 1 STEP -1          //Destroy loo_classarray[li_index]     NEXT     //GarbageCollect()
NEXT
retarray.DisconnectObject()
Destroy retarray

I removed the Destroy for the OLEObjects used to capture the array values as well as the GarbageCollect, and still couldn't produce a leak, even after 10,000 iterations.

 

Can you see what you're doing different from this sample?


Viewing all articles
Browse latest Browse all 8581

Trending Articles