Visual Studio: Як "скопіювати у вихідний каталог" без копіювання структури папки?


111

У мене декілька файлів dll у папці \ lib моєї проектної папки. На сторінці властивостей DLL я вибрав "Створення дій" як "Вміст" та "Копіювати у вихідний каталог" як "Копіювати завжди".

Після побудови я фактично отримую dll скопійовано, але вони знаходяться всередині \ bin \ Release \ lib, а не в \ bin \ Release.

Чи є спосіб скопіювати файли dll в \ bin \ Release (а не в \ bin \ Release \ lib) без написання сценарію після складання або звернення до nant тощо?

Відповіді:


255

замість <Content>використання <ContentWithTargetPath>та вкажіть цільовий шлях, наприклад:

<ItemGroup>
  <ContentWithTargetPath Include="lib\some_file.dat">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <TargetPath>some_file.dat</TargetPath>
  </ContentWithTargetPath>
<ItemGroup>

Зауважте, що цей запис може не бути видимим у Visual Studio (2012, 2015, 2017), але після додавання вручну до csproj він з’явиться у Visual Studio. Цільовий шлях не можна редагувати через інтерфейс користувача.


2
Я не бачу ContentWithTargetPath як варіант дії для збирання в VS 2015. Чи є спосіб його додати?
Кім

1
Після того, як я вручну додав запис у файл .csproj, він з'являється як параметр у IDE. Однак я все ще не можу редагувати цільовий шлях з IDE.
Кім

9
Мене хвилює лише те, що це стане непідтримуваним у майбутніх версіях MSBuild / .NET / Visual Studio / Що б там не було, оскільки інтерфейс VS2015 не показує цю опцію або властивість TargetPath.
MarioDS

1
Це працює для мене. Жодна з інших відповідей для мене не працює. Це має бути відповіддю.
GunWanderer

1
Зауважте, що за допомогою ContentWithTargetPathінкрементальної компіляції перерв (тестовано на VS 2017 15.9.9)
Mads Ravn

26

Тримайте їх $(ProjectDir)\Lib, але додайте ці файли " Як посилання " до кореня вашого .csproj. Тепер вони будуть скопійовані в bin \ Debug (або будь-яку іншу папку виводу), не перебуваючи в lib.

EDIT: Ця відповідь була написана назад, коли ContentWithTargetPath не був доступний у версіях VS / MSBuild, які я використовував. Залишаючи цю відповідь тут людям, яким, можливо, доведеться використовувати старішу версію VS. Будь ласка, припиніть коментувати це, ми всі знаємо, що зараз є кращі способи.


4
Спасибі ananthonline Я спробував ваші кроки, але це не допомогло. Можливо, я роблю щось не так. Ось що я роблю, будь ласка, виправте, якщо ви вважаєте, що щось невірно: 1. Виключіть ці файли з проекту, але нехай вони знаходяться у вікні 2. Клацніть правою кнопкою миші на проект та «Додати існуючі елементи». Виберіть dll з lib та додайте їх "як посилання" 3. Клацніть правою кнопкою миші на клітинках та знову виберіть "Copy Always" у "Copy to Output Directory". 4. Очистити та відновити. Результат: я знову отримав ті dll у \ bin \ release \ lib
OhDear,

1
Будь ласка, опублікуйте скріншот папки вашого рішення після його налаштування
Ані,

3
Якщо я спробую додати посилання на файл, який вже є у дереві проекту, він відмовляється і замість цього знову просто
додає

1
Як і @Nyerguds, я зазначив, що ви не можете додати посилання на файл, який вже є у дереві проекту, тому ця відповідь не вирішує питання.
Tore Østergaard

1
Чи не затоплюється корінь каталогу проектів у Провідника рішень? З багатьма такими файлами це може бути проблемою. Зазвичай корінь каталогу проектів вже містить надто різні файли.
Alex34758

10

Якщо ваша основна мета полягає в тому, щоб включати DLL, не захаращуючи кореневий каталог проекту, іншим рішенням є переміщення DLL в окремий спільний проект і додавання цього в якості посилання в оригінальний проект.

(Зауважте, що ця публікація не відповідає безпосередньо на це запитання, оскільки вона не зберігає папку та структуру проекту, але я вважаю такий підхід корисним, оскільки мені вдалося реструктурувати мій проект у моєму випадку і тому, що я хотів уникнути деяких з Мінуси інших підходів тут.)

Кроки

  • Клацніть правою кнопкою миші Solution -> Add -> New Project -> Shared Project
  • Додайте DLL до цього проекту (у кореневому каталозі цього проекту, а не у підпапці "lib")
  • (Перевірте, чи властивості файлу DLL встановлені правильно, наприклад, Build Action: Contentі Copy to Output Directory: Copy Always)
  • Клацніть правою кнопкою миші оригінальний проект References -> Add Reference -> Shared Projects
  • Виберіть спільний проект, який ви створили раніше

Установка виглядає приблизно так:

рішення-Explorer-скріншот


2
На сьогоднішній день просте і вишукане рішення, щоб зберегти проект не захаращеним.
Раві Ганеш

Я не міг змусити його працювати з файлами UAP та * .bin.
Маттео

7

Додайте dll-файли як посилання на проект, а на посилання "Копіюйте локальний" у true.


1
Дякую Еріку. Це прекрасно працює за винятком одного dll, який я не в змозі додати в якості посилання. Помилка, яку я отримую під час додавання в якості посилання, посилання на "libeay32.dll" не вдалося додати. Переконайтеся, що файл доступний та що він є дійсним складанням або COM-компонентом.
OhDear

7
@MAnthony: В якості посилань на проект можуть бути додані тільки .NET збірки або збірки взаємодії COM; рідні DLL не можуть бути. Вам потрібно буде знайти інший спосіб скопіювати DLL в \ bin \ Release.
Майкл Лю

Дякую Еріку та Майклу та анантоні. Вибачте, не можу оновити ваші відповіді та коментарі, оскільки у мене немає необхідних балів репутації.
OhDear

1
Для керованої DLL вам потрібно буде використовувати метод, який я запропонував нижче.
Ані

4

Якщо вам потрібно скопіювати файли з каталогу Libs у кореневу папку VS2017:

<ItemGroup Condition="'$(Platform)' == 'x64'">
    <None Include="Libs\x64\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

До будь-якої іншої папки, включаючи папку Libs (RecursiveDir)

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

3

У VisualStudio 2015 здається, що якщо dll, які ви 'додаєте за допомогою посилання', знаходяться у підпапці того самого проекту - вони будуть автоматично поміщені в папку, а вихід також розміщений у папці, як ви бачили.

Якщо DLL знаходяться в іншому проекті або каталозі на диску, а не в підпапках проекту , ви можете "Додати за посиланням", і вони будуть добре поміщені в кореневу директорію.


Те саме у VS2012. Він відмовляється перетворювати на них посилання і просто додає їх як вміст. Зрештою, на жаль, найпростішим рішенням, здається, є скидання їх у корінь проекту.
Nyerguds

0

Альтернативний метод - просто залишити елементи як тип None. У провіднику рішень натисніть на ті, які потрібно розгорнути, і встановіть Contentвластивість True.

Примітка: я це робив у VS2019, і все може змінюватися від версії до версії.

Для того, щоб це спрацювало, тепер клацніть правою кнопкою миші на вашому проекті та виберіть "Вивантажити проект". Потім клацніть правою кнопкою миші на завантажений проект і виберіть "Редагувати ім'я проекту.vcxproj".

У редакторі пройдіть до кінця файлу і вставте цю ціль прямо перед кінцевим </Project>тегом:

  <Target Name="CopyContent" AfterTargets="Build">
    <Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
  </Target>

Тепер клацніть правою кнопкою миші на завантажений проект і виберіть "Перезавантажити проект". Виберіть, щоб зберегти і закрити, якщо вам буде запропоновано.

Я також встановив OutputDirectory:

$(SolutionDir)bin\$(Configuration)\$(Platform)\

і IntermediateDirectoryдо:

$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\

на сторінці Загальні властивості проекту. Це додає вихід у папку "bin", а проміжні - у папку "obj" у корені вашого рішення.

Примітка. Значення $(SolutionDir)не визначено, коли ви запускаєте MSBuild з командного рядка. Існує хитрість, яку ви можете використати, щоб визначити це в папці, де живе файл .sln за допомогою GetDirectoryNameOfFileAbove. (залишено як вправу для читача). Крім того, схоже, що в 2019 році вони в будь-якому разі справляються з цим правильно в командному рядку. Да :)$(SolutionDir) містить зворотну косу риску, отже , жоден після нього. Результати кожного повинні мати зворотний нахил.

Тепер, якщо ви володієте Pro або вище, будь ласка, не робіть цього щоразу, коли вам потрібно створити проект. Це було б кульгавим. Натомість, як тільки ви налаштуєте проект так, як вам подобається, виберіть Project -> Export Template. Ви даєте йому ім'я, і ​​наступного разу, коли ви захочете створити проект саме так, просто виберіть це ім'я у діалоговому вікні «Новий проект». (У старшій версії, я думаю, це було Files -> Export Teamplate....)


-1

У мене була така ж проблема з проектом Visual Studio 2010 / C #.

Для складання (тобто з інтерфейсом .NET) використовуйте папку "Список літератури" під вашим проектом у Провіднику рішень. Клацніть правою кнопкою миші, виберіть "Додати існуючий елемент" та знайдіть свою .dll збірку.

Загальні файли .dll можна розмістити у підпапках (як "\ lib" згадувалося вище) та у властивостях виберіть:

  • Build Action = "Довідкові файли"
  • Копіювати в OutputDirectory = "Якщо новіше"

Це працювало для мене саме так, як хотілося - під час збирання .DLL копіюються у вихідний каталог без підпапки "\ lib".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.