C# является компилируемым языком программирования. И обычно весь процесс создания-запуска программы на C# разбивается на два этапа:
Компиляция программы в бинарный пакет с помощью команды dotnet build
Запуск ранее скомпилированной программы с помощью команды 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: для создания простых, самодостаточных утилит консоли/командной строки