Ответ 1
Просто добавьте зависимость сборки к манифесту dll сервера/клиента, который указывает на DLL COM-сервера.
Помните, что манифеста сборки отличается от манифестов приложения: манифест сборки описывает сборку: дает ей имя и перечисляет свои DLL. Явлением приложения является встроенный ресурс RT_MANIFEST, который описывает текущие зависимости модулей.
Итак, в конечном итоге вы бы получили:
- app.exe с внешним (app.exe.manifest) или встроенным RT_MANIFEST, описывающим зависимость от сборки, называемой "acme.clientserver"
- acme.clientserver.manifest, описывающий сборку, и перечисление "clisrv.dll" в качестве бесплатной учетной записи.
- clisrv.dll с внешним (clisrv.dll.2.manifest) или встроенным RT_MANIFEST, описывающим зависимость от сборки, называемой "acme.server"
- acme.server.manifest, описывающий сборку, перечисляя serv.dll как бесплатную учетную запись регистрации.
- serv.dll - который может или не может, в свою очередь, иметь список манифеста еще более зависимых сборок.
Технически можно вызвать сборку по имени dll и объединить как сборку, так и DLL-манифест вместе - загрузчик win32 поддерживает это, но некоторые параметры, которые действительны в манифесте приложений, недействительны в манифесте сборок, что может привести к сбою в результате сборки. Это также очень сложно подписать цифровую подпись.
WRT exe должен иметь манифест: Обычно манифест exe устанавливает контекст активации по умолчанию процессов. Я не уверен на 100%, как работают окна, когда exe не имеет манифеста, но я уверен, что манифесты в dll будут обрабатываться.
Это означает, что проблема сводится к отсутствию поддержки изоляции в CoCreateInstance - по какой-то причине - по умолчанию - CoCreateInstance только просматривает контекст активации по умолчанию для записей reg free com.
Способ переопределения заключается в том, чтобы вручную создать собственный контекст активации, используя API-интерфейс активации
Основным методом было бы вызвать:
- CreateActCtx - создать контекст активации из манифеста dlls.
- ActivateActCtx - для активации контекста
- CoCreateInstance - теперь будет искать текущий контекст активации для записей reg free com.
- DeactivateActCtx - для восстановления контекста активации по умолчанию.
Вы можете добавить /D ISOLATION_AWARE_ENABLED, чтобы обернуть большинство вызовов Windows, которые выполняются контекстами активации, по какой-то причине CoCreateInstance не завернута:/