Разница между контентом сборки и "Копировать в выходной каталог" в Visual Studio

В моем проекте в Visual Studio у меня есть файлы, которые я хочу включить в вывод, но не скомпилированные или встроенные.

Я знаю, что есть два способа сделать это.

  • Настройка действия сборки для файла в "Содержимое"
  • Установка "Копировать в каталог вывода" на "Копировать всегда" или "Копировать, если новый"

Может кто-нибудь сказать мне, в чем разница, и какой сценарий подходит для каждого из вариантов?

Ответ 1

При настройке Build Action на Content файл не будет скомпилирован и будет помещен в группу вывода содержимого.

Будет ли файл получать копии или нет, зависит от параметра Copy to Output Directory в этой точке.

Конечно, если вы установили Copy Always в файл, он может быть скомпилирован и скопирован.

Смотрите Свойства файла в MSDN:

Содержимое. Файл не скомпилирован, но включен в группу вывода контента. Например, этот параметр является значением по умолчанию для .htm или другого типа веб файла.

Ответ 2

Действие сборки содержимого имеет видимый эффект в проектах WPF (возможно, ASP тоже).

Он добавляет

[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("filename")]

до WpfApplication1_Content.g.cs. Читайте о AssemblyAssociatedContentFileAttribute.

В WinForms и консольном приложении (что OP может использовать) он этого не делает, поэтому при создании нет никакого значения для действия None.

В этом комментарии я также нашел заметку о влиянии на развертывание:

Также обратите внимание, что Содержимое будет включено при развертывании с одним щелчком мыши, но None даже не будет выбрано "copy if newer".

Возможно, это работает даже для консольных и WinForms-приложений (я не пробовал).

Ответ 3

Копировать Всегда также инициирует перестройку этого проекта в решении, даже если код не изменился.