scenario:
you have a .NET program, which talks to a (legacy) program using COM.
problem: connecting to COM component fails on some machines.
Your program connects OK to the COM type library, on most machines.
On some machines, the connection fails, with an error that suggests the type library is not registered.
Searching in the type library for the GUID, you can see the location where the DLL is registered.
The DLL turns out to be an older version.
solution: try STAThread attribute on your program's entry point:
alternative solution: make your project a VB.NET WinForms application, which has the side-effect of using STA (Single Threaded Apartment).
explanation:
a COM component, at compile time, is compiled to run within a limited set of the possible COM threading apartments.
Older COM components may be more restricted, and in this case, will only run within an STA (Single Threaded Apartments).
Newer COM components tend to allow for dual apartments, which means they can run within an STA or within an MTA (Multi Threaded Apartment).
note: for a COM component to run safely within an MTA, it's code must be thread safe.
This means that a COM component is more likely to be STA only than MTA.
Comments
Post a Comment