Besides your solution, perhaps the GIT may help. I'm not 100% sure about this, though. Assuming you're wrapping your COM object, the creation of such a wrapper could register the object in the GIT. The question is whether or not you can register the same object multiple times (from two different apartments no less). If you can, the same cookie should be returned. I believe you can use this cookie as your Hashtable key?
> -----Original Message----- > From: Dmitry Shaporenkov [mailto:[EMAIL PROTECTED] > Sent: Friday, September 12, 2003 7:55 AM > To: [EMAIL PROTECTED] > Subject: Re: [ADVANCED-DOTNET] Object identities, marshaling > issues and interoperability > > > ----- Original Message ----- > From: "Jim Sievert" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Friday, September 12, 2003 4:20 PM > Subject: Re: [ADVANCED-DOTNET] Object identities, marshaling > issues and interoperability > > > > 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). > > This is exactly what I'm trying to do. > > > 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... > > Yes, but I can't figure out how this work could be done. > May be I need to marshal IUnknown to a stream and > then use contents of the stream as an identity? If the > contents of the stream is apartment-independent, this will probably > work, but such a solution is obviously inefficient. Or do > I need something else? > > COM experts, please advise! > > > -----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 > > =================================== > 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