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-файла, что должно работать в вашем случае.

Другие вопросы по тегам