2012-05-15 2 views
1

У меня простая консольная программа .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

Спасибо!

+0

Поскольку вы, кажется, спрашиваете, почему, а не как сделать все лучше, см. [Объяснение STA и MTA] (http: //stackoverflow.com/questions/127188/could-you-explain-sta-and-mta). Я думаю, что ** «однажды инициализированный в квартире, является частью этой квартиры на время ее выполнения» ** бит отвечает на это. –

+0

Вы также можете взглянуть на [Interop Marshaling] (http://msdn.microsoft.com/en-us/library/eaw10et3.aspx), чтобы получить дополнительную информацию о ** Маршалинге и COM-апартаментах ** конкретно, как _ COM Маршалер принимает участие при использовании MTA_, что, вероятно, объясняет вашу проблему с броском. –

ответ

2

Использование объекта STA из потока MTA требует сортировки. Стандартная сортировка требует библиотеки типов. Ошибка, которую вы получаете, означает, что библиотека типов не может быть загружена.

Поэтому я бы предположил, что библиотека типов зарегистрирована неправильно. Попробуйте отменить регистрацию и повторную регистрацию DLL, в противном случае попробуйте зарегистрировать библиотеку типов напрямую с помощью REGTLB.exe

+0

Спасибо за ответ. Я повторно зарегистрировал DLL и зарегистрировал библиотеку типов напрямую. Я вижу интерфейс и typelib в реестре с ожидаемыми IID, и я могу открыть typelib в OLE/COM Object Viewer без проблем. Все еще не работает! – pizza247

+2

Это не единственная конфигурация, отправной точкой является HKCR \ Interface, где он ищет ключи ProxyStubClsId и TypeLib. Используйте ProcMon SysInternals, чтобы увидеть, как он ищет эти ключи. –

+0

Исправлено с помощью ProcMon. Спасибо за совет. DLL ActiveX ссылается на сторонний компонент, библиотека типов которого была неправильно зарегистрирована, и этот typelib требуется, потому что я сортирую между потоковыми моделями, как сказал Бен. – pizza247

Смежные вопросы