Создайте проект с относительным путем к 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 в ссылке.