📄 Файл .csproj
в C#
Файл *.csproj
— это основной конфигурационный файл проекта в C# (.NET), который описывает, как проект должен быть собран, какие зависимости использовать, какие настройки применить и т.д.
Он написан в формате XML и управляется с помощью MSBuild
. Хотя многие параметры можно задавать через CLI (dotnet
), понимание и настройка csproj
важны при глубокой работе с проектами.
🧱 Общая структура файла .csproj
Пример простого csproj
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<ProjectReference Include="..\MyLibrary\MyLibrary.csproj" />
</ItemGroup>
</Project>
🔍 Подробности по секциям
🧠 <Project Sdk="...">
-
Указывает, какой SDK использовать. Обычно:
-
Microsoft.NET.Sdk
— для обычных проектов Microsoft.NET.Sdk.Web
— для ASP.NET Core Web-приложенийMicrosoft.NET.Sdk.Razor
— для Razor Class Libraries (Blazor, Razor Pages)
🛠 <PropertyGroup>
В этом блоке настраиваются свойства проекта:
Элемент | Описание |
---|---|
<OutputType> |
Exe (консоль) или Library (библиотека) |
<TargetFramework> |
Целевая платформа, например net6.0 , net8.0 , netstandard2.1 |
<Nullable> |
Включение/отключение Nullable Reference Types (enable/disable ) |
<ImplicitUsings> |
Включает автоматическое добавление using'ов для .NET SDK |
<LangVersion> |
Явное указание версии языка C# (например, 11.0 ) |
<AssemblyName> |
Переименование выходной сборки |
<RootNamespace> |
Корневое пространство имён |
Пример:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>11.0</LangVersion>
</PropertyGroup>
📦 <ItemGroup>
: зависимости и ссылки
Содержит блоки зависимостей.
📦 NuGet-пакеты:
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.123" />
</ItemGroup>
🔗 Ссылки на проекты:
<ItemGroup>
<ProjectReference Include="..\MyLibrary\MyLibrary.csproj" />
</ItemGroup>
📁 Подключение ресурсов:
<ItemGroup>
<None Include="appsettings.json" CopyToOutputDirectory="Always" />
</ItemGroup>
🔄 Условия и конфигурации
Можно задавать различные свойства для Debug
и Release
:
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<Optimize>true</Optimize>
</PropertyGroup>
📌 Включение/исключение файлов
<ItemGroup>
<Compile Include="ExtraClass.cs" />
<Compile Remove="Obsolete.cs" />
</ItemGroup>
🧰 Полезные возможности
- Сборка кросс-платформенных библиотек (мультитаргетинг)
<PropertyGroup>
<TargetFrameworks>net6.0;netstandard2.1;net8.0</TargetFrameworks>
</PropertyGroup>
-
Что это?
Позволяет создавать одну сборку, поддерживающую сразу несколько платформ/.NET-версий. При сборке проект будет компилироваться под каждую указанную платформу отдельно. -
Для чего это полезно?
Если вы пишете библиотеку, которую нужно использовать и в старых, и в новых проектах, или кроссплатформенный код — мультитаргетинг упростит поддержку.
- Публикация в Docker
Файл .csproj
может быть расширен для поддержки публикации и публикационных сценариев Docker через добавление специальных свойств и целей.
Например, можно указать, что при публикации надо создавать самодостаточный (self-contained) образ с нужной платформой:
<PropertyGroup>
<PublishProfile>FolderProfile</PublishProfile>
<PublishSingleFile>true</PublishSingleFile>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
</PropertyGroup>
RuntimeIdentifier
— указывает целевую платформу для сборки (например,win-x64
,linux-x64
,osx-x64
и др.)SelfContained
— создает автономный исполняемый файл, не требующий установленного .NET на хостеPublishSingleFile
— упаковка в один файл
Эти настройки обычно используют в связке с Dockerfile, чтобы при dotnet publish
создавать файлы, которые копируются в контейнер.
- Кастомные сборочные события (
BeforeBuild
,AfterBuild
)
В .csproj
можно определить команды, которые будут выполняться до или после сборки проекта:
<Target Name="BeforeBuild">
<Exec Command="echo 'Начинаем сборку проекта...'" />
</Target>
<Target Name="AfterBuild">
<Exec Command="echo 'Сборка завершена!'" />
</Target>
BeforeBuild
— выполняется до начала компиляцииAfterBuild
— выполняется после успешной компиляции
В командах <Exec Command="..."/>
можно запускать любые консольные команды, скрипты, копирование файлов, генерацию кода и т.д.
Пример практического применения:
<Target Name="AfterBuild">
<Exec Command="dotnet test ..\Tests\MyTests.csproj" />
</Target>
Этот код запустит тесты после сборки.
🔍 Как редактировать .csproj
- Через IDE (Visual Studio или Rider) — чаще всего изменения происходят автоматически.
- Через
dotnet
CLI — предпочтительно:
bash
dotnet add package Dapper
dotnet add reference ../MyLib/MyLib.csproj
3. Вручную — только для кастомных сценариев (например, условной компиляции, специфичных ресурсов, сложных зависимостей и т.д.).