Подтвердить что ты не робот

Доступ к x86 COM с x64.NET

У меня есть сервер x64, который, поскольку мои библиотеки скомпилированы в AnyCPU, выполняется под x64. Нам нужно получить доступ к COM-компоненту, который зарегистрирован в x86. Я не знаю достаточно о COM, и мои поисковые запросы Google меня никуда не ведут.

Вопрос: Могу ли я использовать символическую ссылку реестра с x64 на x86 для COM-компонента? Нужно ли мне регистрировать COM-компонент под x64? Могу ли я (любое утверждение здесь...)?

Спасибо.

4b9b3361

Ответ 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-компонентов, которые вы используете.