Файл .Csproj В C#

Скачать

📄 Файл .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

  1. Через IDE (Visual Studio или Rider) — чаще всего изменения происходят автоматически.
  2. Через dotnet CLI — предпочтительно:

bash dotnet add package Dapper dotnet add reference ../MyLib/MyLib.csproj
3. Вручную — только для кастомных сценариев (например, условной компиляции, специфичных ресурсов, сложных зависимостей и т.д.).


📚 Полезные ссылки