Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Release COM Object in C#

Tags:

c#

com

outlook

I know this has been discussed earlier but I couldn't find a satisfactory answer.

I have an e-mail file (.msg) which I open like below and then call Display.

oApp = new Microsoft.Office.Interop.Outlook.Application();
mail = (Microsoft.Office.Interop.Outlook.MailItem)oApp.Session.OpenSharedItem(fileName);
mail.Display(false);
oApp = null; // do I need to release this object ?

users can close it and re-open it. Before they click "reopen" I check to see if the window still exists, if yes .. then just send a SetForeground(hwnd) to that window. if Not, that means user closed it so just release the mailItem object and open again.

 public static void ReleaseCOMObject(Microsoft.Office.Interop.Outlook.MailItem item) {
        int r = System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
        while (r != 0) {
            r = System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
        }
    }

If I try to open the same file again. It "sometimes" throws a "file in use exception" So, I think even though I am releasing the MailItem .. its not been released properly.

What can I do to ensure that its released properly. closing and reopening a file is a very common scenario.

Any pointers will be very helpful.

like image 950
karephul Avatar asked Feb 13 '12 15:02

karephul


People also ask

What is COM in C?

In conclusion, a COM object is basically a C++ class. A C++ class is just a struct that always starts with a pointer to its VTable (an array of function pointers). And the first three pointers in the VTable will always be named QueryInterface , AddRef , and Release .

What is COM objects in c#?

Component Object Model (COM) is a method to facilitate communication between different applications and languages. COM is used by developers to create re-usable software components, link components together to build applications, and take advantage of Windows services.


1 Answers

If you're using .NET's COM-interop features (you are) then you shouldn't need to worry about this.

COM tracks reference counts - and when the ref count reaches 0 COM objects get released automatically - and .NET takes care of working with the standard COM reference counting mechanism for you.

If you were P/Invoking into a C library things might be different - but you shouldn't have any worries in a standard scenario like yours.

like image 196
Steve Avatar answered Sep 28 '22 01:09

Steve