Этот вопрос задан раньше на SO, например here и here. Сценарий заключается в том, что вы хотите использовать COM-компонент в своем приложении, не регистрируя COM-компонент на машине. Это достигается добавлением двух файлов манифеста один к клиенту, а один к серверу, а боковая функция ОС - позаботится об остальном. Теперь это прекрасно работает, когда все Dll находятся в одной папке.Без регистрации COM Когда Dll находится в отдельной папке
В моем конкретном сценарии я пытаюсь получить dll dll .net 2.0 для dll 4.0. Мы не хотим менять dll 2.0 и с помощью вышеописанного метода я смог выполнить это. Однако, если dll 4.0 находится в подпапке исполняемого файла (2.0 dll). 4.0 dll не найден, когда выполняются бок о бок. Я в настоящее время звоню в API win32 и создаю новый ActivationContext, проходящий в файлах манифеста. Я использовал ProcMon и увидел, что DLL ищет в исполняемом каталоге, а не в пути, указанном в манифесте для поиска. Как видно из вышеприведенных ссылок, кажется, что .net знает только о ClrClass в манифесте и игнорирует AssemblyLocation, предоставленный для личного поиска в сборке, который является неудачным!
В любом случае, обходным путем в приведенных выше ссылках являются GAC и AssemblyResolve. Я не хочу проходить через GAC, если это возможно, и AssemblyResolve не будет работать для меня, поскольку я должен был бы подписаться на него в dll 2.0, который не может загрузить dll 4.0.
Есть ли какой-либо взломать приложение, которое, по его мнению, временно находится где-то в другом месте, чтобы найти dll?
Я также знаю об использовании сервиса (веб, windows), чтобы включить приложение 2.0, вызывающее приложение 4.0. Любые другие возможности были бы оценены, кроме трех выше.
Разве это не похоже на подход 'AssemblyResolve'? EXE использует .net 2.0 и не может загружать COM-библиотеку COM, которая использует среду выполнения 4.0. Или вы имеете в виду конфигурационный файл COM-библиотеки DLL? Я попробую. –
.Net будет использовать файл app.config независимо от того, какая версия .Net используется exe. – shf301
Спасибо. Оно работает. Чтобы уточнить, путь должен указывать на относительный подкаталог в папке основного исполняемого файла. Это не может быть абсолютным путем. Также, если сборка подписана, можно использовать CodeBase и поместить ее куда угодно. –