Как .cs-файлы обнаружены для включения в новый формат .csproj SDK?

#c# #msbuild

#c# #msbuild

Вопрос:

В старом формате файлы были явно включены в элемент <Compile…> . Большинство файлов в новом формате сюда не включены, явно включены только .cs-файлы на уровне .csproj. Обычно «Program.cs» и т. д.

Для этого нет четких объяснений. Большинство просто упоминают «новое соглашение» и «стандартные пути включения и исключения». Что это за пути? Выполняет ли он рекурсивный поиск дочерних папок в папке .csproj? Если я создам другой .cs-файл с конфликтующим типом с другим, который «включен», может ли он быть ошибочно проанализирован, даже если он явно не включен в мое решение?

Комментарии:

1. Я не могу дать вам канонический ответ, но, по моему опыту, он отражает физическую структуру файлов и папок с некоторым интеллектом (т. Е. Без папок obj и bin). Если вы создаете конфликтующий тип, вы получите некоторые (обычно полу-полезные) ошибки компилятора.

2. Вы проверили, что эта компиляция по умолчанию включена в проекты .NET Core ?

Ответ №1:

Включенные по умолчанию компиляции описаны здесь:

Компиляция по умолчанию включает

По умолчанию включает и исключает для элементов компиляции, встроенных ресурсов и None элементов, определенных в SDK. В отличие от проектов .NET Framework, не связанных с SDK, вам не нужно указывать эти элементы в файле проекта, поскольку значения по умолчанию охватывают наиболее распространенные варианты использования. Это делает файл проекта меньше и его легче понять и отредактировать вручную, если это необходимо.

В следующей таблице показано, какие элементы и какие глобусы включены и исключены в .NET SDK:

Элемент Включить глобус Исключить глобус> Удалить глобус
Скомпилировать ** / * .cs (или другие языковые расширения) **/*.user; ** /*.*proj; ** /*.sln; ** /*.vssscc N/A
EmbeddedResource **/ * .resx **/*.user; ** /*.*proj; ** /*.sln; ** /*.vssscc N/A
Нет **/* **/*.user; ** /*.*proj; ** /*.sln; ** /*.vssscc **/*.cs; ** /*.resx

Обратите ./bin ./obj внимание, что папки и, которые представлены свойствами $(BaseOutputPath) и $(BaseIntermediateOutputPath) MSBuild, по умолчанию исключены из глобусов. Исключения представлены свойством $(DefaultItemExcludes) .

Так что да, он рекурсивно выполняет поиск .cs файлов в папке проекта. Если он найдет два файла, которые определяют один и тот же тип, он попытается скомпилировать их оба, и вы получите ошибки компилятора.

Чтобы исключить использование файла

 <Compile Remove="Path/To/File.cs"/>
 

в <ItemGroup> . Вы также можете щелкнуть файл правой кнопкой мыши в Visual Studio и выбрать «Исключить из проекта».