Я пытаюсь установить бесплатную регистрацию COM, но имею небольшую проблему в том, что другой COM-объект может быть клиентом.Регистрация Бесплатные манифесты Com и dll
App.exe -----> COM сервер/клиент длл (зарегистрированный или нет) --------> COM сервера DLL (не зарегистрирован)
Мои вопросы, можно создать манифест для второй dll (COM-сервер/клиентская dll)? Я не контролирую исполняемый файл, но если это так, это работает, если я создаю манифест клиента для исполняемого файла и манифест сервера для DLL сервера COM.
это файл манифеста для средней dll. Я попытался внедрить его и попробовал внешний. Все еще не работает.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32"
name="COMCliSer.dll"
version="1.0.0.0"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
name="COMSer.dll"
version="1.0.0.0"
/>
</dependentAssembly>
</dependency>
</assembly>
При дальнейшем расследовании, я могу получить все это работать, пока средний длл также регистрация бесплатно и EXE имеет манифест приложения. Как только я зарегистрирую среднюю dll и отменим манифест приложения (у меня нет контроля над тем, что exe будет использовать мою dll), все это перестает работать.
Если exe не имеет манифеста, то манифест dll не принимается во внимание. Я могу это доказать, настроив все на работу. Затем допустим ошибку в манифесте сборки. Появится обычное сообщение:
Невозможно создать процесс: это приложение не удалось запустить, поскольку неправильная конфигурация приложения. Переустановка приложения может решить проблему.
Если я затем удалить манифест приложения, загрузки приложения (хотя и в CoCreateInstance терпит неудачу, потому что зависимости не принимаются во внимание)
Почему вы называете сборку 'comser.dll'? Является ли информация о манифесте сборки объединенной? Гораздо проще развернуть сборку с описательным именем, например. «Microsoft.VC90.CRT», который содержит dll с разными именами: «msvcr90.dll». При работе с dll-сборками сложнее отлаживать, поскольку один манифест теперь служит двум целям: описать содержимое сборки для потребителей и описать зависимости DLL в сборке. –
Имена были изменены, чтобы защитить невинных! Это не настоящие имена. Это родные COM-библиотеки DLL, а не сборки .NET. – Steve
Кроме того, что означает «не работает»? Загружает ли exe и 2-й DLL и просто не создает экземпляр третьего, или exe или 2-й dll не могут полностью загрузиться? Невозможность загрузки на самом деле - хороший шаг, так как это означает, что система видит манифест и регистрирует ошибку в системном или прикладном журнале событий как минимум. Если его просто не удается вызвать вызов CoCreateInstance, то он, вероятно, просто не увидит манифест вообще. –