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?