Подтвердить что ты не робот

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

У меня есть несколько DLL файлов в папке \lib моей папки проекта. На странице свойств dll я выбрал "Build Action" как "Content" и "Copy to Output Directory" как "Copy always".

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

Есть ли способ, чтобы скопировать DLL файлы \Bin\Release (а не \Bin\Release\Lib), не написав после сборки script или прибегая к NANT и т.д.?

4b9b3361

Ответ 1

вместо <Content> используйте <ContentWithTargetPath> и укажите целевой путь, например:

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

Обратите внимание, что эта запись может быть не видна в Visual Studio (2012, 2015, 2017), но как только она будет добавлена ​​вручную в csproj, она появится в Visual Studio. Целевой маршрут не будет доступен для редактирования через пользовательский интерфейс.

Ответ 2

Сохраните их в $(ProjectDir)\Lib, но добавьте эти файлы " Как ссылку " в корень вашего .csproj. Теперь они будут скопированы в bin\Debug (или любую другую выходную папку), не находясь в lib.

РЕДАКТИРОВАТЬ: Этот ответ был написан далеко назад, когда ContentWithTargetPath не был доступен в версиях VS/MSBuild, которые я использовал. Оставьте этот ответ здесь для людей, которым, возможно, придется использовать более старую версию VS. Пожалуйста, прекратите комментировать это, мы все знаем, что есть лучшие способы сейчас.

Ответ 3

Добавьте dll файлы в качестве ссылки на проект, а в ссылочном наборе "Скопировать местное" на true.

Ответ 4

Кажется, в VisualStudio 2015, если DLL файлы, которые вы добавляете со ссылкой, находятся в подпапке того же проекта, они автоматически помещают папку, а вывод также помещается в папку, как вы видели.

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

Ответ 5

Если ваше основное намерение состоит в том, чтобы включить библиотеки 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
  • Выберите общий проект, который вы создали ранее

Настройка выглядит следующим образом:

solution-explorer-screenshot

Ответ 6

Если вам нужно скопировать файлы из каталога 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>

Ответ 7

Альтернативный метод - просто оставить элементы типа 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...)

Ответ 8

У меня была такая же проблема с проектом Visual Studio 2010/С#.

Для сборок (то есть имеющих интерфейс .NET) используйте папку "Ссылки" в вашем проекте в обозревателе решений. Щелкните правой кнопкой мыши его, выберите "Добавить существующий элемент" и найдите свою сборку .dll.

Общие. DLL файлы можно поместить во вложенную папку (так как упоминалось выше "\ lib" ), а в свойствах:

  • Build Action = "HelpFiles"
  • Копировать в OutputDirectory = "If Newer"

Это сработало для меня точно так, как вам нужно - во время сборки,.LLs копируются в выходной каталог без подпапки "\ lib".