----- 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