Доступ к x86 COM из x64 .NET - PullRequest
       71

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

24 голосов
/ 11 декабря 2008

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

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

Спасибо.

Ответы [ 3 ]

29 голосов
/ 11 декабря 2008

Если компонент работает под управлением x64-native, он не может загружать 32-битный COM-сервер в процессе, потому что это неправильный процесс. Существует несколько возможных решений:

  1. Если вы можете, создайте 64-битную версию кода COM (которая, конечно, будет регистрироваться в 64-битном реестре). Это самое чистое решение, но оно может оказаться невозможным, если у вас нет кода для COM-сервера.

  2. Запустите ваш .NET-компонент как 32-разрядную версию x86 вместо x64. Я предполагаю, что вы уже рассмотрели и отклонили это по какой-то причине.

  3. Для размещения COM-компонента вне процесса с помощью COM-суррогата DLLhost.exe. Это сделает вызовы к COM-серверу намного, намного медленнее (теперь они будут межпроцессными сообщениями Windows вместо вызовов собственных функций), но в остальном прозрачна (вам не нужно делать ничего особенного).

    Это, вероятно, не будет вариантом, если серверу требуется пользовательская заглушка прокси вместо обычной oleaut32 (хотя и очень редко), поскольку 64-разрядная версия прокси не будет доступна. Пока он может использовать обычный OLE-маршаллинг, вы можете просто зарегистрировать его для суррогатной активации .

7 голосов
/ 15 января 2009

Я нашел это решение, Работа с устаревшими 32-битными компонентами в 64-битной Windows см. В статье:
• Преобразование типа проекта из незавершенного в процесс
• Использование COM + в качестве хоста (это работа для меня)
• Использование dllhost в качестве суррогатного хоста

2 голосов
/ 11 декабря 2008

Если ваш COM-компонент размещен на COM-сервере (то есть в отдельном процессе), вам не нужно делать ничего особенного, так как подсистема COM будет перенаправлять ваши звонки из приложения x64 в приложение X86 и обратно. 1001 *

Если ваш компонент является внутрипроцессным COM-компонентом, вам придется переосмыслить вещи, поскольку 64-битный процесс не может использовать 32-битный в COM-компонентах процесса. Вы можете заставить свой сервер работать под x86, чтобы иметь доступ к компонентам (они оба будут 32-битными процессами). Если вы не хотите этого делать, вам придется проверить, есть ли у вас 64-битная версия COM-компонентов, которые вы используете.

...