Создайте проект с относительным путем к DLL

Я создал проект aC# в нем я ссылаюсь на system.windows.interactivity.dll.
Что мне интересно, так это как настроить проект так, чтобы при сборке *.exe я получал такую ​​структуру:

Program Folder
    program.exe
Libraries Folder
    system.windows.interactivity.dll

Я попытался немного поэкспериментировать, поместив папку "Библиотеки" в папку решения, чтобы она находилась на том же уровне, что и папка проекта. Это дает относительный путь в файле csproj "..\Libraries\system.windows.interactivity.dll", однако это не может быть решением, так как при компиляции он копирует dll в папку отладки с exe, и он сохраняет это структура пути "того же уровня".

Как я могу изменить вещи так, чтобы он помещал и ссылался на dll в другом каталоге?

[Обновить]
Поэтому я изменил следующее в моем проекте:
1: изменено свойство "Копировать локальное" в ссылочной system.windows.interactivity.dll на False.
2: Добавлен следующий код в файл csproj, чтобы проверить, существует ли папка Libraries над выходным каталогом, если не создать, а затем скопировать в DLL.

  <Target Name="BeforeBuild">
    <MakeDir Directories="$(OutDir)..\Libraries" 
             Condition="!Exists('$(OutDir)..\Libraries')" />
    <Copy SourceFiles="..\Libraries\System.Windows.Interactivity.dll" 
          DestinationFolder="$(OutDir)..\Libraries" 
          ContinueOnError="True" />
  </Target>

3. Добавьте следующий код в App.config, чтобы добавить другое местоположение для приложения для поиска DLL.

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

Мои выводы:
После создания приложения все файлы находятся именно там, где я хочу, как в структуре в моем исходном посте. Когда я пытаюсь запустить EXE из выходного каталога, он не может найти DLL.

[/Обновить]

1 ответ

Решение

Используя app.config, вы можете указать.NET проверять подкаталоги для поиска сборок (.NET нужно знать, как найти библиотеки DLL, когда приложение запускается, когда они находятся в нестандартном месте):

https://msdn.microsoft.com/en-us/library/823z9h8w(v=vs.110).aspx

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

Вы можете изменить файл.csproj для выполнения задачи BeforeBuild/AfterBuild и скопировать dll в подкаталог. Однако, если вам действительно нужна эта структура для развертывания, возможно, было бы проще включить ее в логику пакета / установщика, а не в логику прямой сборки. Как правило, гораздо проще просто позволить компилятору выбрать место назначения для ваших DLL.

Вот пример того, как вы должны создать задачу копирования BeforeBuild:

Скопируйте все файлы и папки, используя msbuild

Вы можете указать Visual Studio не копировать DLL в выходную папку, установив для параметра "Копировать локальный" значение false в ссылке.

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