2015-08-11 2 views
1

Этот вопрос задан раньше на 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. Любые другие возможности были бы оценены, кроме трех выше.

ответ

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

+0

Разве это не похоже на подход 'AssemblyResolve'? EXE использует .net 2.0 и не может загружать COM-библиотеку COM, которая использует среду выполнения 4.0. Или вы имеете в виду конфигурационный файл COM-библиотеки DLL? Я попробую. –

+0

.Net будет использовать файл app.config независимо от того, какая версия .Net используется exe. – shf301

+0

Спасибо. Оно работает. Чтобы уточнить, путь должен указывать на относительный подкаталог в папке основного исполняемого файла. Это не может быть абсолютным путем. Также, если сборка подписана, можно использовать CodeBase и поместить ее куда угодно. –

Смежные вопросы