Доступ к x86 COM с x64.NET
У меня есть сервер x64, который, поскольку мои библиотеки скомпилированы в AnyCPU, выполняется под x64. Нам нужно получить доступ к COM-компоненту, который зарегистрирован в x86. Я не знаю достаточно о COM, и мои поисковые запросы Google меня никуда не ведут.
Вопрос: Могу ли я использовать символическую ссылку реестра с x64 на x86 для COM-компонента? Нужно ли мне регистрировать COM-компонент под x64? Могу ли я (любое утверждение здесь...)?
Спасибо.
Ответы
Ответ 1
Если компонент работает на основе x64, он не может загрузить 32-битный COM-сервер в процессе, потому что это неправильный процесс. Возможны несколько решений:
-
Если вы можете, создайте 64-битную версию COM-кода (который, конечно же, зарегистрировался бы в 64-битном реестре). Это самое чистое решение, но может быть невозможно, если у вас нет кода для COM-сервера.
-
Запустите свой компонент .NET как 32-разрядный x86 вместо x64. Я предполагаю, что вы уже рассмотрели и отклонили это по какой-то причине.
-
Внесите COM-компонент вне процесса, используя COM-суррогат DLLhost.exe. Это вызовет вызовы на COM-сервер намного, намного медленнее (теперь они будут межпроцессорными сообщениями Windows вместо собственных вызовов функций), но в противном случае прозрачны (вам не нужно ничего делать особо).
Это, вероятно, не будет вариантом, если серверу требуется настраиваемый прокси-заглушка вместо использования обычного oleaut32 (что очень редко, хотя), так как не будет доступной 64-разрядной версии прокси-сервера. Пока он может использовать обычную сортировку OLE, вы можете просто зарегистрировать его для суррогатной активации.
Ответ 2
Я нашел это решение, Работа с устаревшими 32-разрядными компонентами в 64-разрядной Windows см. в статье:
• Преобразование типа проекта из процесса в нерабочий процесс
• Использование COM + в качестве хоста (эта работа для меня)
• Использование dllhost в качестве суррогатного хозяина
Ответ 3
Это ваш COM-компонент размещен на COM-сервере (т.е. отдельный процесс), тогда вам не нужно ничего делать, поскольку подсистема COM удалит ваши вызовы из вашего x64-приложения в приложение X86 и обратно.
Если ваш компонент является COM-компонентом в процессе, вам придется переосмыслить все, поскольку 64-битный процесс не может использовать 32-битные компоненты COM-процесса. Вы можете заставить ваш сервер работать под управлением x86, чтобы вы могли получить доступ к компонентам (они оба будут 32-битными процессами). Если вы не хотите этого делать, вам придется посмотреть, есть ли 64-разрядная версия COM-компонентов, которые вы используете.