Каждый раз, когда мне нужно связать файл с проектом ASP.NET как ссылку, всегда есть что-то, что я забыл сделать, потому что Visual Studio слишком грубо и раздражает их. У него есть ошибка/ограничение, поэтому он не копирует файл в папку вывода Debug, и мы должны изменить свойства файла, чтобы он также был скопирован в папку вывода публикации.
Я изучил это с трудом, после многих исследований, и создал цель AfterBuild, чтобы помочь облегчить этот процесс. Однако при добавлении файла все еще нужно выполнить ручную работу.
Вот пример для проекта, который я поддерживаю. Предположим, мы хотим добавить файл YIUCARD в папку "Утилиты" проекта ASP.NET.
1) Щелкните правой кнопкой мыши папку "Утилиты" в Visual Studio и выберите "Добавить → Существующий элемент".
2) Выберите файл для добавления, нажав на него ONCE (не дважды щелкните).
3) Нажмите стрелку рядом с кнопкой "Добавить" и выберите "Добавить как ссылку".
В настоящий момент это ничего не сделает. Файл не будет скопирован в любую папку (Debug и Publish). Он просто добавлен в проект.
4) Щелкните правой кнопкой мыши в файле и откройте "Свойства".
5) Изменение: "Построить действие" на "Контент" "Копировать в каталог вывода" на "Копировать всегда"
В это время файл будет скопирован в папку вывода публикации (в любом месте, которое мы определяем при публикации). Однако, когда мы отлаживаем локально (F5), это не будет работать, потому что файл не скопирован в локальную папку "Утилиты" на базе кода.
6) Сохраните изменения в Visual Studio, выбрав "Сохранить все". Это значит, что файл ".csproj" сохраняется, поскольку мы внесли в него изменения, и теперь мы отредактируем его вручную.
7) Откройте ".csproj" в Notepad ++.
8) Добавьте файл в событие "BeforeBuild" (здесь мое):
<Target Name="BeforeBuild">
<ItemGroup>
<UtilitiesFiles Include="..\path\to\file\REDOPXX.NEW" />
<UtilitiesFiles Include="..\path\to\file\REDFMTST" />
<UtilitiesFiles Include="..\path\to\file\JOBCARD" />
<UtilitiesFiles Include="..\path\to\file\YIUCARD" />
</ItemGroup>
<Copy SourceFiles="@(UtilitiesFiles)" DestinationFolder=".\utilities" SkipUnchangedFiles="true" />
</Target>
9) У меня есть событие AfterBuild для режима Release, которое автоматически публикует проект для меня, так что файлы идут непосредственно в папку вывода, которую я хочу:
<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release' ">
<PropertyGroup>
<OutputDir>..\path\to\publish\MyProject</OutputDir>
</PropertyGroup>
<Message Importance="High" Text="Output DIR: $(OutputDir)" />
<RemoveDir Directories="$(OutputDir)" ContinueOnError="true" />
<MSBuild Projects="MyProject.csproj" Properties="Configuration=$(Configuration);WebProjectOutputDir=$(OutputDir);OutDir=$(OutputDir)bin\" Targets="ResolveReferences;_CopyWebApplication" />
</Target>
10) Сохраните файл в Notepad ++ и перезагрузите его в Visual Studio.
Когда вы создадите проект, файл будет скопирован в папки "Отладка" и "Отпуск/публикация"!
Однако я хотел бы знать, есть ли более простой/интуитивный способ сделать это.
Вы можете сказать, что это будет исправлено путем изменения выходной папки Debug так же, как и папки Release/Publish, чтобы файлы были там после первого опубликованного вами. Однако, обратите внимание, что есть и ошибка. Если я использую папку вывода, отличную от "bin", файлы aspx будут жаловаться на то, что они не смогут найти сборки. Даже если я установил "Копировать в выходной каталог" в "Копировать всегда", он будет жаловаться, что "Global.asax.cs" не найден.
См. следующие вопросы:
Сообщение об ошибке Parser: не удалось загрузить тип 'TestMvcApplication.MvcApplication'
"Невозможно загрузить тип [пространство имен].Global" вызвав мое горе
Является ли это исправлено/улучшено в новых версиях Visual Studio?