« Can't download Quake4 or Condemned on Xb... | Main | Virtual Machines and External Hard Drive... »

ReleaseComObject and IsComObject

Posted 2006-01-03 05:11 PM in Programming.

We had a COM Object that needed to have ReleaseComObject called on it. This worked fine, and happily for a while. Then, someone created a .NET object with the exact same signature so that it might easily replace the use of the COM object. However, this new assemebly is NOT a COM Object, so it's extraordinarily bad to call ReleaseComObject on it (in that it totally doesn't work.)

So, here's a good best practice if you're doing some crazy crap like this:

if(Marshal.IsComObject(foo)) Marshal.ReleaseComObject(foo);



Wednesday, January 04, 2006 9:46:01 AM (Pacific Standard Time, UTC-08:00)
A good example of how this can come into play is if you have an old COM object and you use an interop from your managed code. Say you want to replace the COM object with a managed object. I don't want to get too far off track here but while you can make the managed code look like the old COM object via various COM attributes, you will run into problems if you run multiple AppDomains (NUnit, IIS) due to the managed client code to COM interop to managed server code path. A workaround for this is to gut the interop code, keeping the interface, name, and so on, and replacing the marshalling code with a direct call to the new managed component. Now you have managed client code that uses an "interop", which is really 100% managed, that then calls more managed code.

That all works unless your client code calls ReleaseComObject without checking IsComObject first. Since it isn't a COM object anymore you will get an InvalidCastException. Like Scott said, it's a good practice as it allows you to convert your legacy COM objects to managed code in the future with no client side code change.
Peter Thomas
Wednesday, January 04, 2006 1:15:40 PM (Pacific Standard Time, UTC-08:00)
I am amazed that ReleaseComObject is not a nop on everything not a COM object, or at least make that behaviour optional.

Do we really want to know via an exception that the operation is meaningless?

--
Thomas
Thomas Eyde
Comments are closed.

Contact

Sponsors

Hosting By

Hot Topics

Tags

Calendar

<November 2009>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Archives

November, 2009 (5)
October, 2009 (19)
September, 2009 (11)
August, 2009 (12)
July, 2009 (21)
June, 2009 (26)
May, 2009 (16)
April, 2009 (13)
March, 2009 (17)
February, 2009 (17)
January, 2009 (18)
December, 2008 (32)
November, 2008 (17)
October, 2008 (22)
September, 2008 (16)
August, 2008 (14)
July, 2008 (25)
June, 2008 (19)
May, 2008 (17)
April, 2008 (17)
March, 2008 (26)
February, 2008 (21)
January, 2008 (28)
December, 2007 (19)
November, 2007 (17)
October, 2007 (31)
September, 2007 (39)
August, 2007 (37)
July, 2007 (43)
June, 2007 (37)
May, 2007 (32)
April, 2007 (38)
March, 2007 (29)
February, 2007 (46)
January, 2007 (31)
December, 2006 (27)
November, 2006 (31)
October, 2006 (32)
September, 2006 (39)
August, 2006 (34)
July, 2006 (40)
June, 2006 (18)
May, 2006 (31)
April, 2006 (34)
March, 2006 (30)
February, 2006 (38)
January, 2006 (44)
December, 2005 (19)
November, 2005 (34)
October, 2005 (24)
September, 2005 (37)
August, 2005 (20)
July, 2005 (24)
June, 2005 (33)
May, 2005 (16)
April, 2005 (22)
March, 2005 (34)
February, 2005 (15)
January, 2005 (37)
December, 2004 (28)
November, 2004 (30)
October, 2004 (34)
September, 2004 (22)
August, 2004 (34)
July, 2004 (18)
June, 2004 (64)
May, 2004 (49)
April, 2004 (21)
March, 2004 (29)
February, 2004 (29)
January, 2004 (36)
December, 2003 (25)
November, 2003 (24)
October, 2003 (59)
September, 2003 (42)
August, 2003 (24)
July, 2003 (44)
June, 2003 (29)
May, 2003 (21)
April, 2003 (30)
March, 2003 (27)
February, 2003 (47)
January, 2003 (50)
December, 2002 (31)
November, 2002 (38)
October, 2002 (44)
September, 2002 (15)
May, 2002 (2)
April, 2002 (4)

Google Ads