Interop from a timer event
I have a service that accesses a VB6 COM component on a timer event. On
64-bit windows (running in 32-bit "mode") the process fails if it is run in
a secondary thread but works fine when run on the main thread. This
behavior cannot be re-produced in 32-bit environment.
Any help would be greatly appreciated.
The error is:
System.InvalidCastException: Unable to cast COM object of type 'blah.type'
to interface type 'blah.interfacetype'. This operation failed because the
QueryInterface call on the COM component for the interface with IID
'{[guid....]]}' failed due to the following error: Error loading type
library/DLL. (Exception frm HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).
The exact code from the same components runs fine in 64-bit environment
(again running in 32-bit mode) if it is not run on a secondary thread.
I'm not using a primary interop assembly and nothing is running from the GAC
except framework stuff.
thanks,
-chris
Date:Sat, 11 Aug 2007 13:52:14 -0500
Author:
|
Re: Interop from a timer event
I should mention: All code is C# targeting x86 cpu using framework 2.0
i have a "fairly" simple example that demonstrates the problem.
-chris
"Chris Yager" <chris.yager@gldsolutions.com.invalid> wrote in message
news:Oy5gujE3HHA.4184@TK2MSFTNGP06.phx.gbl...
>I have a service that accesses a VB6 COM component on a timer event. On
>64-bit windows (running in 32-bit "mode") the process fails if it is run in
>a secondary thread but works fine when run on the main thread. This
>behavior cannot be re-produced in 32-bit environment.
>
> Any help would be greatly appreciated.
>
> The error is:
>
> System.InvalidCastException: Unable to cast COM object of type 'blah.type'
> to interface type 'blah.interfacetype'. This operation failed because the
> QueryInterface call on the COM component for the interface with IID
> '{[guid....]]}' failed due to the following error: Error loading type
> library/DLL. (Exception frm HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).
>
> The exact code from the same components runs fine in 64-bit environment
> (again running in 32-bit mode) if it is not run on a secondary thread.
>
> I'm not using a primary interop assembly and nothing is running from the
> GAC except framework stuff.
>
> thanks,
> -chris
>
Date:Sat, 11 Aug 2007 13:59:34 -0500
Author:
|
Re: Interop from a timer event
>I have a service that accesses a VB6 COM component on a timer event. On
>64-bit windows (running in 32-bit "mode") the process fails if it is run in
>a secondary thread but works fine when run on the main thread. This
>behavior cannot be re-produced in 32-bit environment.
>
>Any help would be greatly appreciated.
I'm guessing the thread has the wrong ApartmentState.
Mattias
--
Mattias Sjgren [C# MVP] mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Date:Mon, 13 Aug 2007 00:20:04 +0200
Author:
|
Re: Interop from a timer event
I'd considered that but it behaves well in 32-bit windows.
thanks for the response,
-chris
"Mattias Sjgren" wrote in message
news:e4p2A8S3HHA.1184@TK2MSFTNGP04.phx.gbl...
>
>>I have a service that accesses a VB6 COM component on a timer event. On
>>64-bit windows (running in 32-bit "mode") the process fails if it is run
>>in
>>a secondary thread but works fine when run on the main thread. This
>>behavior cannot be re-produced in 32-bit environment.
>>
>>Any help would be greatly appreciated.
>
>
> I'm guessing the thread has the wrong ApartmentState.
>
>
> Mattias
>
> --
> Mattias Sjgren [C# MVP] mattias @ mvps.org
> http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
> Please reply only to the newsgroup.
Date:Sun, 12 Aug 2007 18:35:55 -0500
Author:
|
Re: Interop from a timer event
Hi Chris,
the error message indicates that the typelib cannot be loaded - can you
load it manually using LoadRegTypeLib (on 64-bit windows) or do you get
the same error?
--Johannes
Chris Yager wrote:
> I'd considered that but it behaves well in 32-bit windows.
>
> thanks for the response,
> -chris
>
> "Mattias Sjgren" wrote in message
> news:e4p2A8S3HHA.1184@TK2MSFTNGP04.phx.gbl...
>>> I have a service that accesses a VB6 COM component on a timer event. On
>>> 64-bit windows (running in 32-bit "mode") the process fails if it is run
>>> in
>>> a secondary thread but works fine when run on the main thread. This
>>> behavior cannot be re-produced in 32-bit environment.
>>>
>>> Any help would be greatly appreciated.
>>
>> I'm guessing the thread has the wrong ApartmentState.
>>
>>
>> Mattias
>>
>> --
>> Mattias Sjgren [C# MVP] mattias @ mvps.org
>> http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
>> Please reply only to the newsgroup.
>
>
--
Johannes Passing - http://int3.de/
Date:Mon, 13 Aug 2007 17:47:08 +0200
Author:
|
Re: Interop from a timer event
Thanks to all for the help.
The problem was the apartment state.
I spawned an additional thread off the timer's thread and set the apartment
state to "STA" and everything works as expected.
Thanks again,
-chris
"Mattias Sjgren" wrote in message
news:e4p2A8S3HHA.1184@TK2MSFTNGP04.phx.gbl...
>
>>I have a service that accesses a VB6 COM component on a timer event. On
>>64-bit windows (running in 32-bit "mode") the process fails if it is run
>>in
>>a secondary thread but works fine when run on the main thread. This
>>behavior cannot be re-produced in 32-bit environment.
>>
>>Any help would be greatly appreciated.
>
>
> I'm guessing the thread has the wrong ApartmentState.
>
>
> Mattias
>
> --
> Mattias Sjgren [C# MVP] mattias @ mvps.org
> http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
> Please reply only to the newsgroup.
Date:Wed, 15 Aug 2007 08:40:57 -0500
Author:
|