У меня простая консольная программа .NET 3.5, ориентированная на x86, которая вызывает методы на COM-объектах в ActiveX DLL через interop. В моем реестре ActiveX DLL имеет ThreadingModel квартиры. Когда .NET-программа работает в потоке STA, все работает нормально. В потоке MTA некоторые из методов COM работают нормально, другие дают мне:TYPE_E_CANTLOADLIBRARY - COM interop через поток MTA
System.InvalidCastException: Невозможно передать COM-объект типа «MyComTypeClass» в тип интерфейса «_MyComType». Эта операция завершилась неудачно, потому что вызов QueryInterface для COM-компонента для интерфейса с IID '{[опущен]}' не удалось из-за следующей ошибки: Ошибка загрузки библиотеки типов/DLL. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).
Если я переключу ThreadingModel ActiveX на Free или Both, программа .NET работает в потоке MTA, но я хочу сохранить ThreadingModel в Apartment.
Эта же программа .NET с такой же ActiveX DLL и сборкой interop отлично работает на нескольких других машинах (WinXP 32-bit, Win7 64), используя обе модели потоков. Исключение происходит только на одном ПК (Win7 64) и только в потоке MTA. Кто-нибудь знает, почему?
Аналогичные вопросы были заданы без решения, надеясь, 3-й раз это очарование:
COM Exception - TYPE_E_CANTLOADLIBRARY?
TYPE_E_CANTLOADLIBRARY when using a COM object on a separate thread on Windows 2003 x64 only
Спасибо!
Поскольку вы, кажется, спрашиваете, почему, а не как сделать все лучше, см. [Объяснение STA и MTA] (http: //stackoverflow.com/questions/127188/could-you-explain-sta-and-mta). Я думаю, что ** «однажды инициализированный в квартире, является частью этой квартиры на время ее выполнения» ** бит отвечает на это. –
Вы также можете взглянуть на [Interop Marshaling] (http://msdn.microsoft.com/en-us/library/eaw10et3.aspx), чтобы получить дополнительную информацию о ** Маршалинге и COM-апартаментах ** конкретно, как _ COM Маршалер принимает участие при использовании MTA_, что, вероятно, объясняет вашу проблему с броском. –