Your best bet is to compare objects based on their IUnknowns.  You can use
GetIUnknownForObject() for this (don't forget to call Release when you're
done).  Because these IUnknown values are Apartment relative, you just can't
plop the IUnknown as a key in the Hashtable.  You're going to have to do
some work -- probably by specializing the Hashtable...

> -----Original Message-----
> From: Dmitry Shaporenkov [mailto:[EMAIL PROTECTED] 
> Sent: Friday, September 12, 2003 4:25 AM
> To: [EMAIL PROTECTED]
> Subject: [ADVANCED-DOTNET] Object identities, marshaling 
> issues and interoperability
> 
> 
> Hi all,
> 
> I need help in a problem concerning COM/.NET interoperability 
> in a multithreaded application. The application (written in 
> C#) uses an external component which exposes COM-based object 
> model. Let's say 'Item' is an object of the model, item has a 
> __CComObject type. Items are accessed via calls to the 
> component like the follows:
> 
> ....
>    Item anItem =  externalObject.GetItem ("MyItem");
> ....
> 
> During startup a worker thread is running to collect some 
> information about items and store it in a hashtable (using 
> items as the keys):
> 
> ....
>     Hashtable theCache = new Hashtable ();
>     theCache [anItem] = <something>;
> ...
> 
> The information is then used from code executing in the UI thread:
> 
> ...
>    Item anItem =  externalObject.GetItem ("MyItem");
>    <something> = theCache [anItem]; // Oops. This does not work ...
> 
> The problem is that, because UI thread lives in a STA and the 
> worker thread executes in another apartment, the UI thread 
> gets different wrapper than the worker thread, since items 
> are marshalled across apartments. I realize that this is 
> normal behavior. However, I need a way to identify items in a 
> thread-independent fashion. Items themselves do not have any 
> properties which might serve as a reliable unique identifiers.
> 
> So, the question is, how such problems are resolved? May be 
> there is still a way to get apartment-independent identifier 
> of the object? I am not a COM guru, but I took a look at 
> System.Runtime.InteropServices.Marshal class and found 
> nothing similar.
> 
> Any advices / references will be greatly appreciated. Thanks 
> in advance.
> 
> Regards,
> Dmitry Shaporenkov
> mailto:[EMAIL PROTECTED]
> 
> ===================================
> This list is hosted by DevelopMentor-  http://www.develop.com 
> NEW! ASP.NET courses you may be interested in:
> 
> 2 Days of ASP.NET, 29 Sept 2003, in Redmond 
> http://www.develop.com/courses/2daspdotnet
> 
> Guerrilla 
> ASP.NET, 13 Oct 2003, in Boston 
> http://www.develop.com/courses/gaspdotnet
> 
> View archives and 
> manage your subscription(s) at http://discuss.develop.com
> 

===================================
This list is hosted by DevelopMentor╝  http://www.develop.com
NEW! ASP.NET courses you may be interested in:

2 Days of ASP.NET, 29 Sept 2003, in Redmond
http://www.develop.com/courses/2daspdotnet

Guerrilla ASP.NET, 13 Oct 2003, in Boston
http://www.develop.com/courses/gaspdotnet

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to