0

Как подгрузить .dll файлы из другой папки?

Файл .exe рядом с .dll работает корректно. Но если переместить .exe файл в любое другое место, то .exe не находит эти .dll.

Вопрос: Как задать папку откуда будут браться эти .dll ?

Без конфига (файла проекта)!

  • а как подгрузить dll, который рядом с exe? – Grundy Jan 10 '19 at 16:04
  • Полагаю, вам нужно это – Alexander Petrov Jan 10 '19 at 16:07
  • 3
    А мне кажется тут смело можно закрывать дубликатом на это или это. А автору может будет полезно и вовсе запаковать все в .exe, об этом тут. – EvgeniyZ Jan 10 '19 at 16:10
  • @EvgeniyZ, Запаковать нет, не стремлюсь к этому. Нужно именно подгружать из папки – InvertSOD Jan 10 '19 at 16:10
  • 1
    @InvertSOD Две ссылки выше про это и идут. – EvgeniyZ Jan 10 '19 at 16:11
  • @Grundy, dll которые лежат рядом с .exe просто взаимодействуют они как-то сами подгружаются. Вот я хочу понять как можно сделать из другой папки. – InvertSOD Jan 10 '19 at 16:11
  • @EvgeniyZ, Мне нужно без конфига. – InvertSOD Jan 10 '19 at 16:12
  • @InvertSOD Ну так наверно это все надо указывать в вопросе, верно? А то мы сейчас вытягиваем из вас клешнями информацию.... – EvgeniyZ Jan 10 '19 at 16:14
  • @EvgeniyZ, Извиняюсь, добавил. – InvertSOD Jan 10 '19 at 16:16
  • @alexander barakin, Вы читайте что я написал, без конфига! – InvertSOD Jan 10 '19 at 19:50

3 Answers3

3

Если без конфига, то только так:

using System.Reflection;

//...

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
     string newdir = "c:\\MyDirectory";        
     string path = Path.Combine(newdir, args.Name);

     if (!path.EndsWith(".dll"))
     {
         path = path + ".dll";
     }

     Assembly ass = Assembly.LoadFile(path);
     return ass;      
}

//...

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
  • А как можно проверить загрузились ли библиотеки или нет?! – InvertSOD Jan 10 '19 at 19:11
  • @InvertSOD если не загрузились, будет исключение при первом обращении к классу из этой библиотеки – MSDN.WhiteKnight Jan 10 '19 at 19:16
  • как тогда в таком случае решать проблему? – InvertSOD Jan 10 '19 at 19:17
  • @InvertSOD Отлаживать. Для начала убедиться, что обработчик события вообще запускается, что Assembly.LoadFile не возвращает null и т.п. Я надеюсь, строку AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; вы поместили в коде до того, как библиотека используется? – MSDN.WhiteKnight Jan 10 '19 at 19:21
  • это решение для загрузки только управляемых DLL. Для неуправляемых, решение будет другим.
  • – MSDN.WhiteKnight Jan 10 '19 at 19:24
  • А для неправляемых что требуется? Вообще у меня подгрузка от net и native. – InvertSOD Jan 10 '19 at 19:31
  • 1
    @InvertSOD для неуправляемых все проще: SetDllDirectory – MSDN.WhiteKnight Jan 11 '19 at 03:06
  • А как освобождать .dll файлы через Assembly и SetDllDirectory ? – InvertSOD Jan 11 '19 at 10:44
  • @InvertSOD Никак. Управляемые сборки выгружаются только выгрузкой всего домена приложений. Неуправляемые dll можно выгрузить с помощью FreeLibrary, но это нужно делать только для тех, которые вы явно загружаете через LoadLibrary. – MSDN.WhiteKnight Jan 11 '19 at 14:57