При использовании .Net Interop (создается с помощью TlbImp) мой COM-объект отказывается выполнять в суррогатном (dllhost) - PullRequest
1 голос
/ 09 марта 2010

Это очень странно.

У нас есть некоторый управляемый C ++ (сборка), который использует .NET COM-взаимодействие dll, сгенерированное TlbImp, для выполнения вызовов в COM-объект. Когда мы регистрируем COM DLL, мы указываем, что мы хотим, чтобы она выполнялась в суррогате (запись реестра «DLLSurrogate»).

Наша COM-библиотека является 64-разрядной и работает на 64-разрядной платформе.

Когда мы интегрируем сборку с 32-разрядным приложением (которое содержит управляемый и неуправляемый код), вызовы в библиотеку COM выполняются в DllHost. 64-битная сборка того же приложения приводит к тому, что вызовы выполняются в вызывающем процессе.

Чистые неуправляемые клиентские приложения (как 32, так и 64-разрядные) работают правильно в 64-разрядной системе, что показывает (я надеюсь), что мы правильно настроили / установили библиотеку COM.

Это может указывать на то, что .NET COM Interop игнорирует информацию о конфигурации в реестре. 32-битный клиент не может загрузить 64-битную COM DLL в свое адресное пространство и по умолчанию использует суррогат? В любом случае, такое поведение для нас губительно, поскольку библиотека COM содержит одноэлементный доступ к некоторому оборудованию и, возможно, множество клиентских процессов.

Кто-нибудь отмечал это поведение раньше?

Спасибо

Майк Д

1 Ответ

2 голосов
/ 09 марта 2010

Это странный запрос, почти всегда наоборот; пытаюсь использовать 32-битный COM-сервер из 64-битного кода. Если у вас есть 32-битная сборка сервера, то обязательно используйте его в процессе, гораздо эффективнее и проще в работе, чем суррогат вне процесса.

Реестр в 64-разрядной версии Windows виртуализирован для 32-разрядных приложений. Все 32-битные COM-регистрации хранятся в HKLM \ Software \ Wow6432Node. Используйте Regedit.exe, чтобы убедиться, что регистрация COM-сервера действительно присутствует там.

У вас также может быть проблема с DLL прокси / заглушки для COM-сервера. Они понадобятся, потому что ваш сервер работает в другом процессе. Обязательно соберите эти библиотеки DLL как в 32-битной, так и в 64-битной версиях и зарегистрируйте их в правильной версии Regsvr32.exe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...