COM без регистрации, когда Dll находится в отдельной папке
Этот вопрос был задан ранее на SO, например, здесь и здесь. Сценарий таков, что кто-то хочет использовать COM-компонент в своем приложении без необходимости регистрации COM-компонента на компьютере. Это достигается путем добавления двух файлов манифеста, одного к клиенту, а другого к серверу, а остальная часть функции ОС позаботится об остальном. Теперь это работает нормально, когда все Dll находятся в одной папке.
В моем конкретном сценарии я пытаюсь получить доступ к устаревшей.NET 2.0 dll 4.0 dll. Мы не хотим менять 2.0 dll, и с помощью вышеуказанного метода я смог сделать это. Однако, если 4.0 dll находится в подпапке исполняемого файла (2.0 dll). 4.0 dll не найден, когда начинается параллельное выполнение. В настоящее время я вызываю API-интерфейс win32 и создаю новый ActivationContext, передавая файлы манифеста. Я использовал ProcMon и увидел, что dll ищется в каталоге исполняемых файлов, а не в пути, указанном в манифесте для поиска. Как видно из приведенных выше ссылок, кажется, что.net знает только о ClrClass в манифесте и игнорирует AssemblyLocation, предоставленный для поиска частных сборок, что очень печально!
В любом случае, обходными путями в вышеуказанных ссылках являются GAC и AssemblyResolve. Я не хочу проходить через GAC, если это возможно, и AssemblyResolve не будет работать для меня, так как я должен был бы подписаться на него в 2.0 dll, который не может загрузить 4.0 dll.
Есть ли какой-нибудь тип взлома, чтобы приложение считало, что оно временно находится где-то еще, так что будет найдена dll?
Мне также известно об использовании службы (web, windows) для включения приложения 2.0, вызывающего приложение 4.0. Любые другие возможности будут оценены, кроме трех выше.
1 ответ
Вы должны быть в состоянии использовать <probing>
элемент в вашем app.config
чтобы CLR просматривал подпапки при поиске сборок. Так что если ваша 4.0 DLL находится в подпапке ComDll
ваш app.config будет выглядеть примерно так:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="ComDll"/>
</assemblyBinding>
</runtime>
</configuration>
Личные пути должны быть подпапками вашего EXE-файла, что должно работать в вашем случае.