3

Пишу на C# используя Visual Studio. Я хотел бы что бы после компиляции папка с программой была более структурирована.

В данном случае - что бы все DLL-ки скидывались в папку, например, под названием "Libs".

Есть ли возможность так настроить?

В идеале после компиляции я хочу получить следующее:

введите сюда описание изображения

insolor
  • 49,104
  • что в данном случае является костылем? dll'ки из одного solution? или для любого проекта dll? – Grundy Dec 11 '18 at 11:08
  • А я уберу лишнее упоминание костылей, т.к. это весьма субъективная штука. – Kromster Dec 11 '18 at 11:09
  • например, создание ярлыка на экзешник через батник и перенос всех файлов в папку :D. И вызов батника на моменте компиляции) – Andrew Stop_RU_war_in_UA Dec 11 '18 at 11:10
  • ну в лоб решение = прописать post-build event который перенесет dll-ку куда надо. но наверно должно быть по интереснее решение – Grundy Dec 11 '18 at 11:12
  • связанный вопрос https://ru.stackoverflow.com/questions/1033485/%d0%a1%d0%ba%d0%bb%d0%b0%d0%b4%d1%8b%d0%b2%d0%b0%d1%82%d1%8c-%d0%b7%d0%b0%d0%b2%d0%b8%d1%81%d0%b8%d0%bc%d0%be%d1%81%d1%82%d0%b8-%d0%b2-%d0%be%d1%82%d0%b4%d0%b5%d0%bb%d1%8c%d0%bd%d1%83%d1%8e-%d0%bf%d0%b0%d0%bf%d0%ba%d1%83-%d0%bf%d1%80%d0%b8-%d0%ba%d0%be%d0%bc%d0%bf%d0%b8%d0%bb%d1%8f%d1%86%d0%b8%d0%b8 – 4per Mar 16 '20 at 10:56

1 Answers1

8

Нужно добавить метаданные DestinationSubDirectory для элемента ReferenceCopyLocalPaths в файле проекта. Но, поскольку эти элементы не статические, а создаваемые в процессе сборки - добавлять им метаданные нужно через ItemDefinitionGroup.

Открываете файл проекта любым текстовым редактором (можно открыть прямо в студии если сначала выгрузить проект, а потом открыть его как XML) и добавляете в конец:

<ItemDefinitionGroup>
  <ReferenceCopyLocalPaths>
    <DestinationSubDirectory>lib\</DestinationSubDirectory>
  </ReferenceCopyLocalPaths>
</ItemDefinitionGroup>

Теперь нужно сделать так, чтобы эти библиотеки нашлись при запуске проекта. Для этого нужно поправить app.config (только проследите чтобы у вас в конфиге не оказалось двух секций runtime):

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

UPD если вы используете MSBuild Core (тот, который вызывается через dotnet), то способ с ItemDefinitionGroup поломает вам поиск зависимостей (см. баг https://github.com/dotnet/sdk/issues/10859)

Но вот такое решение должно работать:

<Target Name="SetupDestinationSubDirectory" AfterTargets="ResolveAssemblyReferences">
  <ItemGroup>
    <ReferenceCopyLocalPaths Update="*" DestinationSubDirectory="lib/" />
  </ItemGroup>
</Target>
Pavel Mayorov
  • 58,537
  • проверю и отмечу как правильный ответ – Andrew Stop_RU_war_in_UA Dec 11 '18 at 12:13
  • А можно ли сделать такое поведение по дэфолту? Ну то есть что б каждый новый проэкт сразу имел даные настройки? – Andrew Stop_RU_war_in_UA Dec 11 '18 at 12:42
  • 2
    @Andrew разве что создать свой шаблон проекта. Или найти и отредактировать системный. – Pavel Mayorov Dec 11 '18 at 12:46
  • 1
    Можно попробовать Directory.Build.props. При сборке свойства описанные в нем будут автоматически применены к проектам, т.е определяем DestinationSubDirectory и условие по которому оно будет перезаписываться - condition от OutputType свойства. – UserName Dec 12 '18 at 12:21