EnumeratorViewOfEnumVariant implements an interface called
ICustomAdapter, which has a method called GetUnderlyingObject. So if
you use IEnumerator explicitly (rather than doing foreach) you can do
the following:
IEnumerator enumerator = comObj.GetEnumerator();
try
{
while (enumerator.MoveNext()) { ... }
}
finally
{
ICustomAdapter adapter = (ICustomAdapter)enumerator;
Marshal.ReleaseComObject(adapter.GetUnderlyingObject());
}
Adam
-----Original Message-----
From: Rune Huseby [mailto:[EMAIL PROTECTED]]
Sent: Friday, April 19, 2002 10:41 AM
To: [EMAIL PROTECTED]
Subject: [DOTNET] COM interop and explicit Release of IEnumXXXX
I need to explicitly Release some COM-objects that hold on
to some precious resources. Unfortunately these objects
doesn't provide a Close method.
I have found Marshall.ReleaseComObject(), that will
release the object for most RCW-objects.
The bad news is that ReleaseComObject() will not work
on the IEnumerator-interface that is wrapped around
IEnumXXXX. It appears the the RCW IEnumerator is implemented
by EnumeratorViewOfEnumVariant, that in turn holds
a reference to the IEnumXXX in its private m_pEnumVariantObj
member. And since EnumeratorViewOfEnumVariant inaccessible to
my code, I have dangling resources.
Setting all my references to null and calling GC.Collect();
does not seem to help either.
The COM-library I am using is Visual SourceSafe Automation,
and the troublesome COM-object is VSSVersions, which there can be
only one instance of.
--
Rune Huseby
You can read messages from the DOTNET archive, unsubscribe from DOTNET,
or
subscribe to other DevelopMentor lists at http://discuss.develop.com.
You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.