регистрация свободного COM без копирования dll в тот же каталог, что и исполняемый файл - PullRequest
3 голосов
/ 18 июня 2011

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

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

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

Я не хочу изменять исполняемый файл или его каталог, например добавлять внешний манифест.
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, и запускаю его оттуда, но хотел бы избежать этого шага.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

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

1 голос
/ 23 мая 2012

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

<file name = "DLLFolder\YourDll.dll">

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

...