Регистрация Free COM без копирования DLL в тот же каталог, что и исполняемый файл

StackOverflow https://stackoverflow.com/questions/6393865

  •  29-10-2019
  •  | 
  •  

Вопрос

Как я могу использовать COM-объект без регистрации, не копируя dll в тот же каталог, что и исполняемый файл? Возможно ли это?

Мне нужен полный рабочий образец или подробное пошаговое руководство для моего точного сценария.

Например, у меня есть следующие компоненты:
CppTestRunner.exe - консольное приложение vc ++
CppTests.dll - vc ++ mfc dll
CsCOMServer.dll - видимая dll c # COM

Я не хочу изменять исполняемый файл или его каталог, например добавлять внешний манифест.
CppTests.dll находится в другом каталоге, чем exe.
Это нормально, если CsCOMServer.dll находится в том же каталоге, что и CppTests.dll.

CppTestRunner.exe вызывает LoadLibrary для CppTests.dll, которая работает нормально.

После внедрения манифестов и использования apis контекста активации Windows мне удалось скопировать CsCOMServer.dll в каталог exe, чтобы убедиться, что CppTests.dll может без проблем создать экземпляр CsCOMServer.dll, но, опять же, я пытаюсь избегайте этого шага.

В настоящее время, когда CsCOMServer.dll находится в том же каталоге, что и CppTests.dll, и без CsCOMServer.dll в каталоге exe, я получаю следующую ошибку при вызове CoCreateInstance:
Ошибка= 0x80070002 Системе не удается найти указанный файл.

Я использовал монитор процессов sysinternals для отслеживания путей, по которым CppTestRunner.exe просматривает и т. д.
Я заметил, что в зависимости от того, что я пытаюсь сделать, иногда CppTestRunner.exe пытается прочитать CsCOMServer.dll.config в том же каталоге, что и CppTests.dll, но независимо от того, что я пытаюсь туда вставить, мне не удавалось получить мимо ошибки.
Кроме того, в зависимости от того, что я пытаюсь сделать, CppTestRunner.exe пытается прочитать CsCOMServer.dll в том же каталоге, что и CppTests.dll, но по какой-то причине я все равно получаю ту же ошибку.

Кто-нибудь знает, как работает код именно с этим сценарием?

Как вы, наверное, догадались, это часть некоторых модульных \ интеграционных тестов.

В качестве простого обходного пути я сейчас копирую CppTestRunner.exe в тот же каталог, что и CppTests.dll, и запускаю его оттуда, но хотел бы избежать этого шага.

Спасибо.

Это было полезно?

Решение

.NET ищет управляемый COM без регистрации сначала в GAC, а затем в папке исполняемого файла.Он использует контекст активации для чтения метаданных активации, но не для определения местоположения самих файлов.

Другие советы

Вы можете сохранить DLL в подпапке, скажем, DLLFolder \ YourDll.dll , а в файле манифеста вашей DLL напишите имя файла, например

общий

Но вам необходимо сохранить файл манифеста (DLL) в том месте, где хранится EXE.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top