6

Есть один .exe и одна .dll.

Когда в References указываю путь к dll, ставлю Copy Local = false. Так вот .exe пытаеться найти .dll у себя в bin\Debug и выбрасывает Exception: "Не удается найти указанный файл."

Мне нужно, чтоб .exe тянул .dll из её родной директории, а не копировал .dll в сою директорию и потом уже тянул её оттуда.

Deleted
  • 371
Murad
  • 3,724

2 Answers2

10

Флаг "Copy Local" к этому не имеет отношения (он только говорит студии, надо ли копировать dll в папку выхода проекта).

Программа пытается загрузить dll сначала из файловой системы (текущая директория, файлы которые попадают в path и т.д.), потом из GAG. Соответственно, в Вашем случае, Вы скорее всего используете референс напрямую на dll и эта dll не в GAG.

Подробнее здесь и здесь.

Вам в любом случае надо будет:

1. Либо делать copy local.

2. Либо класть dll в системные файлы.

3. Либо регистрировать dll в GAG.

4. Либо в самой программе указывать путь к поиску dll:

AppDomain.CurrentDomain.AppendPrivatePath(@"bin\DLLs");
Deleted
  • 371
Чад
  • 9,073
9

Добавлю, что есть и другой путь: создать файл конфигурации <Program-name>.exe.config следующего содержания:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="SubPath1;SubPath2" />
      </assemblyBinding>
   </runtime>
</configuration>

где SubPath1, SubPath2 - поддиректории каталога с приложением.

Тогда поиск будет происходить изначально в папке приложения, затем в поддиректории <Имя-сборки>\ и после этого в SubPath1, SubPath2.

AlexeyM
  • 1,988
  • а как теперь положить этот файл конфигурации в папку, например, .\config? – masuhorukov Mar 27 '14 at 12:43
  • @masuhorukov: никак. Этот файл обязан быть в одном каталоге с .exe (или, кажется, подлинкован к нему как ресурс). – VladD Mar 27 '14 at 14:07