object that has been separated from its underlying RCW

J

j

Hi All,

what can be reason for this??
i'm trying to retrieve commandsBar, and once in a while got this
strange exception
within Outlook 2003.

System.Runtime.InteropServices.InvalidComObjectException: COM object
that has been separated from its underlying RCW cannot be used.
at Microsoft.Office.Interop.Outlook.ExplorerClass.get_CommandBars()


Any ideas??
 
T

Tobias Böhm

Hi All,

what can be reason for this??
i'm trying to retrieve commandsBar, and once in a while got this
strange exception
within Outlook 2003.

System.Runtime.InteropServices.InvalidComObjectException: COM object
that has been separated from its underlying RCW cannot be used.
   at Microsoft.Office.Interop.Outlook.ExplorerClass.get_CommandBars()

Any ideas??

Hi,

the reason for this is that you are using a COM object that is already
released.

Following code will throw that exception:

Outlook.MailItem mailItem = activeInspector.CurrentItem;
Marshal.ReleaseCOMObject(mailItem);
string mailItemSubject = mailItem.Subject;

Hope that helps,
Tobias
 
J

j

Hi,

the reason for this is that you are using a COM object that is already
released.

Following code will throw that exception:

Outlook.MailItem mailItem = activeInspector.CurrentItem;
Marshal.ReleaseCOMObject(mailItem);
string mailItemSubject = mailItem.Subject;

Hope that helps,
Tobias

Thanks,

I see, however i access the Outlook excplorer's ui object.
You want to point that now even in Outlook (without any programming)
impossible to access the File Menu for example??
The Outlook is alive.
I don't understant this.

Please explain, thanks in advance.
 
T

Tobias Böhm

Thanks,

I see, however i access the Outlook excplorer's ui object.
You want to point that now even in Outlook (without any programming)
impossible to access the File Menu for example??
The Outlook is alive.
I don't understant this.

Please explain, thanks in advance.

If that happens even when you just use Outlook, maybe it's another Add-
In causing the problem. Try disabling installed Add-Ins.

Tobias
 
J

j

If that happens even when you just use Outlook, maybe it's another Add-
In causing the problem. Try disabling installed Add-Ins.

Tobias- Hide quoted text -

- Show quoted text -

There is no other addIns.
My question is if for expample i execute the following line of code:
--> myExplorer is active explorer
Marshal.ReleaseCOMObject(myExplorer.CommandBars);

so now, i'll failed to work with Otulook's Menu ??
 
K

Ken Slovak - [MVP - Outlook]

When the Interop wrapper for a COM object (RCW) is released it releases the
references to that object and you get that error when you try to then access
that object. That is caused by calling Marshal.ReleaseComObject() on the
object, or a similar call such as FinalReleaseComObject(), as explained by
Tobias.

One thing to be aware of is that if you have an Explorer object (or any
other) and you pass a copy of that Explorer to a procedure and in that
procedure you call one of the release methods the original object is
released, not just the copy passed to the procedure:

DoFoobarSub(_explorer);
if (_explorer.Caption == "Inbox") // fires RCW exception
{
}


private void DoFoobarSub(Outlook.Explorer exp)
{
// whatever
Marshal.ReleaseComObject(exp);
}

Any attempt to access _explorer after calling that DoFoobarSub() method will
fire an RCW exception.

In addition, although you say there are no other addins at all, you also
have to bear that in mind. If your managed code addin is not shimmed to
provide an exclusive AppDomain for it then things like this or any
exceptions or crashes in any managed code addin in the default AppDomain
will affect your addin. That's why shimming is so important for managed code
addins.



If that happens even when you just use Outlook, maybe it's another Add-
In causing the problem. Try disabling installed Add-Ins.

Tobias- Hide quoted text -

- Show quoted text -

There is no other addIns.
My question is if for expample i execute the following line of code:
--> myExplorer is active explorer
Marshal.ReleaseCOMObject(myExplorer.CommandBars);

so now, i'll failed to work with Otulook's Menu ??
 
J

j

When the Interop wrapper for a COM object (RCW) is released it releases the
references to that object and you get that error when you try to then access
that object. That is caused by calling Marshal.ReleaseComObject() on the
object, or a similar call such as FinalReleaseComObject(), as explained by
Tobias.

One thing to be aware of is that if you have an Explorer object (or any
other) and you pass a copy of that Explorer to a procedure and in that
procedure you call one of the release methods the original object is
released, not just the copy passed to the procedure:

DoFoobarSub(_explorer);
if (_explorer.Caption == "Inbox") // fires RCW exception
{

}

private void DoFoobarSub(Outlook.Explorer exp)
{
    // whatever
    Marshal.ReleaseComObject(exp);

}

Any attempt to access _explorer after calling that DoFoobarSub() method will
fire an RCW exception.

In addition, although you say there are no other addins at all, you also
have to bear that in mind. If your managed code addin is not shimmed to
provide an exclusive AppDomain for it then things like this or any
exceptions or crashes in any managed code addin in the default AppDomain
will affect your addin. That's why shimming is so important for managed code
addins.
--
Ken Slovak
[MVP - Outlook]http://www.slovaktech.com
Author: Professional Programming Outlook 2007.
Reminder Manager, Extended Reminders, Attachment Options.http://www.slovaktech.com/products.htm


If that happens even when you just use Outlook, maybe it's another Add-
In causing the problem. Try disabling installed Add-Ins.
Tobias- Hide quoted text -
- Show quoted text -

There is no other addIns.
My question is if for expample i execute the following line of  code:
--> myExplorer is active explorer
Marshal.ReleaseCOMObject(myExplorer.CommandBars);

so now, i'll failed to work with Otulook's Menu ??- Hide quoted text -

- Show quoted text -

The AddIn provides an exclusive AppDomain. Also can please explain a
litle bit about shimming??

In my code i use Marshal.ReleaseCOMObject(...). I do it because of rpc
conneciton known issue limitation.
There is a command netstat -a
What should i see there?? How can i recognize open rpc conenction in
Outlook??

Many many thanks.
 
K

Ken Slovak - [MVP - Outlook]

For information on netstat post in a networking group or google for the
information.

The RPC channel issue is real but you have to use common sense as to when
you call ReleaseComObject(). You do that mainly in loops on subsidiary
properties such as a mail item within a loop accessing the Items collection
of a folder. You never call that if you need to re-use the object again,
unless you explicitly instantiate another instance of the object afterwards.

You should always strive to declare objects at the lowest scope where they
will be needed, and release them when done with the objects, but don't
release objects you will have further use for.

Shimming provides a unique AppDomain for a managed code application. You
have to explicitly shim an addin or use VSTO, which does the shimming for
you. Either you write your own shimming code or you use the COM Shim Wizard
to create the shim for you. Shimming doesn't happen without an explicit shim
that loads your addin. If there is no shim then your code is running in a
common AppDomain and not an exclusive one.




<snip>

The AddIn provides an exclusive AppDomain. Also can please explain a
litle bit about shimming??

In my code i use Marshal.ReleaseCOMObject(...). I do it because of rpc
conneciton known issue limitation.
There is a command netstat -a
What should i see there?? How can i recognize open rpc conenction in
Outlook??

Many many thanks.
 
J

j

For information on netstat post in a networking group or google for the
information.

The RPC channel issue is real but you have to use common sense as to when
you call ReleaseComObject(). You do that mainly in loops on subsidiary
properties such as a mail item within a loop accessing the Items collection
of a folder. You never call that if you need to re-use the object again,
unless you explicitly instantiate another instance of the object afterwards.

You should always strive to declare objects at the lowest scope where they
will be needed, and release them when done with the objects, but don't
release objects you will have further use for.

Shimming provides a unique AppDomain for a managed code application. You
have to explicitly shim an addin or use VSTO, which does the shimming for
you. Either you write your own shimming code or you use the COM Shim Wizard
to create the shim for you. Shimming doesn't happen without an explicit shim
that loads your addin. If there is no shim then your code is running in a
common AppDomain and not an exclusive one.

--
Ken Slovak
[MVP - Outlook]http://www.slovaktech.com
Author: Professional Programming Outlook 2007.
Reminder Manager, Extended Reminders, Attachment Options.http://www.slovaktech.com/products.htm


<snip>

The AddIn provides an exclusive AppDomain. Also can please explain a
litle bit about shimming??

In my code i use Marshal.ReleaseCOMObject(...). I do it because of rpc
conneciton known issue limitation.
There is a command netstat -a
What should i see there?? How can i recognize open rpc conenction in
Outlook??

Many many thanks.

Thanks for such details explanation.
So, in case i'll not use VSTO and will develop shared AddIn, i'll to
build shim by myself??
There is no wizard for it?
 
K

Ken Slovak - [MVP - Outlook]

As I said in my last post:

Either you write your own shimming code or you use the COM Shim Wizard to
create the shim for you. There is a COM Shim Wizard.

For VS 2005 you download it from MS, google for that, for VS 2008 it's
built-in.

As I also said my last post: VSTO does the shimming for you.

If shimming is the only reason you have not to use VSTO then you picked the
wrong reason.




<snip>

Thanks for such details explanation.
So, in case i'll not use VSTO and will develop shared AddIn, i'll to
build shim by myself??
There is no wizard for it?
 
J

j

As I said in my last post:

 Either you write your own shimming code or you use the COM Shim Wizardto
create the shim for you. There is a COM Shim Wizard.

For VS 2005 you download it from MS, google for that, for VS 2008 it's
built-in.

As I also said my last post: VSTO does the shimming for you.

If shimming is the only reason you have not to use VSTO then you picked the
wrong reason.

--
Ken Slovak
[MVP - Outlook]http://www.slovaktech.com
Author: Professional Programming Outlook 2007.
Reminder Manager, Extended Reminders, Attachment Options.http://www.slovaktech.com/products.htm


<snip>

Thanks for such details explanation.
So, in case i'll not use VSTO and will develop shared AddIn, i'll to
build shim by myself??
There is no wizard for it?

Thanks,

Does Shared Add-in wizard in VS-2005 create/handle the shim issue??

Thanks in advance.
 
K

Ken Slovak - [MVP - Outlook]

Are you reading what I said at all?
Either you write your own shimming code or you use the COM Shim Wizard to
create the shim for you. There is a COM Shim Wizard.

For VS 2005 you download it from MS, google for that, for VS 2008 it's
built-in.

The shared addin wizard does just that, it creates a shared addin template.
If you want that addin shimmed you download the COM Shim Wizard and run
that.



<snip>

Thanks,

Does Shared Add-in wizard in VS-2005 create/handle the shim issue??

Thanks in advance.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top