Полное руководство по языку программирования С# 14 и платформе .NET 10 / Публикация приложения

C# и .NET | Приложения на основе файлов

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

C# является компилируемым языком программирования. И обычно весь процесс создания-запуска программы на C# разбивается на два этапа:

  1. Компиляция программы в бинарный пакет с помощью команды dotnet build

  2. Запуск ранее скомпилированной программы с помощью команды dotnet run

Кроме того, даже для самого простого C# приложения требовалась определенная структура: файл проекта с расширением .csproj (а в случае приложений на нескольких проектах - файл решения .sln) и собственно исходный код в файлах с расширением .cs. Без файла проекта .csproj код просто бы не скомпилировался.

Но начиная с C# 14 и .NET 10 можно создавать приложения на основе файлов (file-based app). Это упрощает сборку и запуск программ на C#. Фактически эта новая возможность превращает С# в первоклассный скриптовый язык, который идеально подходит для небольших утилит, автоматизации и быстрого прототипирования.

Теперь для создания и запуска программы на C# достаточно определить файл с кодом на C# и передать его команде команды dotnet run. По сути файловые приложения - это обычные программы на C#, которые используют синтаксис инструкций верхнего уровня (Top-Level Statements), что позволяет писать код без явного объявления класса Program и метода Main.

Например, определим файл hello.cs с каким-нибудь простеньким содержимым:

Console.WriteLine("Hello METANIT.COM");

В консоли перейдем в папке, где располагается данный файл, и выполним команду dotnet run hello.cs


eugene@Eugene:/dotnet/scripts$ dotnet run hello.cs
Hello METANIT.COM
eugene@Eugene:/dotnet/scripts$ 

Это делает C# более доступным для новичков, а также более привлекательным для разработчиков, которым нужно быстро написать скрипт или небольшую утилиту командной строки без необходимости настройки полноценного проекта.

Ожидается, что в будущих версиях .NET будет расширена поддержка для многофайловых скриптов, что еще больше повысит гибкость файловых приложений.

Развитие

Когда скрипт на основе файла вырастет и потребует более сложной организации, его можно легко преобразовать в стандартный проект C# с помощью команды:


dotnet project convert app.cs

Ключевые особенности и директивы

Чтобы обеспечить функциональность, которая ранее требовала csproj-файла (например, ссылки на NuGet-пакеты), были введены специальные директивы на уровне файла:

  • #:package <имя_пакета>[@<версия>]

    Позволяет ссылаться на пакеты NuGet. Например:

    #:package Microsoft.EntityFrameworkCore.Sqlite@10.0.0

    В данном случае подключается nuget-пакет "Microsoft.EntityFrameworkCore.Sqlite" версии "10.0.0".

  • #:sdk <имя_SDK>

    Позволяет указать необходимый SDK (например, для веб-приложений). Например:

    #:sdk Microsoft.NET.Sdk.Web
  • #:property <свойство>=<значение>

    Позволяет устанавливать свойства MSBuild

  • Например, вот как может выглядеть минимальное веб-приложение (Minimal API), полностью содержащееся в одном файле app.cs:

    
    #:sdk Microsoft.NET.Sdk.Web
    
    var builder = WebApplication.CreateBuilder();
    var app = builder.Build();
     
    app.MapGet("/", () => "Hello METANIT.COM!");
     
    app.Run();
    

    Я не буду подробно вдаваться в данный код (кому интересено, может подробнее прочитать про веб-приложения в соответствующем руководстве в статье - Первое приложение на ASP.NET Core с .NET CLI). Сейчас же нас здесь будет интересовать только первая строка:

    #:sdk Microsoft.NET.Sdk.Web

    именно она подключает всю необходимую функциональность из SDK Microsoft.NET.Sdk.Web для создания веб-приложения. И теперь запустим это приложение командой dotnet run app.cs

    
    eugene@Eugene:/dotnet/scripts$ dotnet run app.cs
    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: http://localhost:5000
    info: Microsoft.Hosting.Lifetime[0]
          Application started. Press Ctrl+C to shut down.
    info: Microsoft.Hosting.Lifetime[0]
          Hosting environment: Production
    info: Microsoft.Hosting.Lifetime[0]
          Content root path: /dotnet/scripts
    
    

    Из этого вывода мы видим, что приложение успешно запущено, и мы можем обратиться к нему по адресу "http://localhost:5000" (адрес по умолчанию). Обратимся по этому адресу в браузере:

    Сценарии использования

    Файловые приложения идеально подходят для следующих задач:

    • Скриптинг и автоматизация: как замена скриптов на Bash, PowerShell или Python для операционных задач и автоматизации

    • Прототипирование: для быстрого тестирования идеи или API-интерфейса

    • Обучение: более низкий порог входа для новичков в C#, что позволяет писать и запускать код без сложной структуры проекта и необходимости ее понимания

    • Утилиты CLI: для создания простых, самодостаточных утилит консоли/командной строки

    Проверь себя

    📋 Тест по теме «C# и .NET | Приложения на основе файлов» Тест по теме

    Практические задания

    Лёгкое Ручная проверка Заполните пропуск в коде (1)
    +10 XP

    В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

    _____.WriteLine("Hello METANIT.COM");
    Войдите, чтобы отправить решение
    Лёгкое Ручная проверка Заполните пропуск в коде (2)
    +10 XP

    В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

    eugene@_____:/dotnet/scripts$ dotnet run hello.cs
    Hello METANIT.COM
    eugene@Eugene:/dotnet/scripts$
    Войдите, чтобы отправить решение
    Лёгкое Ручная проверка Заполните пропуск в коде (3)
    +10 XP

    В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

    dotnet project _____ app.cs
    Войдите, чтобы отправить решение
    Лёгкое Ручная проверка Заполните пропуск в коде (4)
    +10 XP

    В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

    #:sdk Microsoft.NET._____.Web
    
    var builder = WebApplication.CreateBuilder();
    var app = builder.Build();
     
    app.MapGet("/", () => "Hello METANIT.COM!");
     
    app.Run();
    Войдите, чтобы отправить решение
    Лёгкое Ручная проверка Заполните пропуск в коде (5)
    +10 XP

    В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

    #:sdk Microsoft.NET.Sdk._____
    Войдите, чтобы отправить решение
    Среднее Ручная проверка Восстановите код по памяти (1)
    +20 XP

    В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

    _____.WriteLine("_____ METANIT.COM");
    Войдите, чтобы отправить решение
    Среднее Ручная проверка Восстановите код по памяти (2)
    +20 XP

    В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

    eugene@_____:/dotnet/scripts$ dotnet run hello.cs
    Hello _____.COM
    eugene@Eugene:/dotnet/scripts$
    Войдите, чтобы отправить решение
    Среднее Ручная проверка Расставьте строки кода в правильном порядке
    +20 XP

    Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

    eugene@Eugene:/dotnet/scripts$ dotnet run hello.cs
    eugene@Eugene:/dotnet/scripts$
    Hello METANIT.COM
    Войдите, чтобы отправить решение
    Сложное Ручная проверка Объясните и модифицируйте пример из урока «C# и .NET | Приложения на основе файлов»
    +30 XP

    Опишите своими словами, что делает приведённый пример кода из урока «C# и .NET | Приложения на основе файлов», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

    Console.WriteLine("Hello METANIT.COM");
    Войдите, чтобы отправить решение
    Сложное Ручная проверка Найдите потенциальную проблему в коде урока «C# и .NET | Приложения на основе файлов»
    +30 XP

    Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

    eugene@Eugene:/dotnet/scripts$ dotnet run hello.cs
    Hello METANIT.COM
    eugene@Eugene:/dotnet/scripts$
    Войдите, чтобы отправить решение
    Мини-проект Ручная проверка Мини-проект по теме «C# и .NET | Приложения на основе файлов»
    +50 XP

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

    Войдите, чтобы отправить решение
    Домашнее задание Ручная проверка Домашнее задание по теме «C# и .NET | Приложения на основе файлов»
    +25 XP

    Напишите собственную небольшую программу, применяющую материал темы «C# и .NET | Приложения на основе файлов». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

    Войдите, чтобы отправить решение

    Обсуждение (0)

    Войдите, чтобы оставить комментарий.