.NET 10 sắp ra mắt. Một trong những tính năng cực kỳ thú vị của .NET 10 là bạn có thể chạy trực tiếp các file C# riêng lẻ mà không cần tạo project.
Chạy script là cách mạnh mẽ cho các tác vụ đơn giản, nhưng cũng cho các tác vụ mà bạn chạy như một phần của pipeline CI/CD (CI=Continuous Integration, CD=Continous Deployment). Với .NET 10, bạn có thể sử dụng C# ở nhiều nơi mà trước đây bạn từng sử dụng PowerShell hoặc bất kỳ ngôn ngữ script nào khác.
Mục lục
Chạy một file C#
Hãy bắt đầu với một file C# đơn giản. Trong thư mục C:\Code trên máy cục bộ của tôi, tôi tạo một file Program.cs với nội dung bên dưới. Nó sẽ ghi các thư mục của ổ đĩa C: ra console.
var myDirectories = Directory.GetDirectories(@"C:\");
foreach (var dir in myDirectories)
{
Console.WriteLine(dir);
}
Bây giờ hãy sử dụng lệnh dotnet run để chạy file Program.cs này trực tiếp mà không tạo một project C# rõ ràng. Để chạy lệnh này, .NET 10 hoặc phiên bản mới hơn phải được cài đặt trên máy của bạn.
dotnet run Program.cs
Thật tuyệt vời phải không?
Nếu bạn quen thuộc với các ngôn ngữ lập trình khác cho phép bạn thực thi một file, chẳng hạn như Python, bạn có thể đánh giá cao rằng cách tiếp cận này hiện cũng có sẵn cho C# với .NET 10.
Nó hoạt động thế nào trong Python?
Trong Python, bạn có thể thực thi các file theo cách tương tự. Bạn có thể tạo ví dụ một file Program.py với nội dung bên dưới thực hiện chính xác điều tương tự như file C# ở trên – liệt kê các thư mục của ổ đĩa C:.
import os
for dir in os.listdir(r'C:\\'):
path = os.path.join(r'C:\\', dir)
if os.path.isdir(path):
print(path)
Với Python được cài đặt trên máy của bạn, bạn có thể thực thi file với lệnh này:
python Program.py
Như bạn vừa học trong bài đăng blog này, với .NET 10, bạn có thể làm điều tương tự với các file C# của mình.
Về các Package NuGet thì sao?
Bạn cũng có thể tham chiếu các package NuGet trong các file C# riêng lẻ của mình với một cú pháp mới có dạng:
#:package YourPackage@1.0.0
Hãy điều chỉnh file Program.cs của tôi và hãy bao gồm Serilog để ghi log, thay vì ghi trực tiếp ra console thông qua Console.WriteLine.
Đoạn code bên dưới hiển thị file Program.cs đầy đủ hiện sử dụng các package NuGet Serilog và Serilog.Sinks.Console. Sau hai chỉ thị #:package, một chỉ thị using cho namespace Serilog được thêm vào, và sau đó thuộc tính tĩnh Log.Logger được khởi tạo với một logger ghi ra console.
#:package Serilog@4.3.0
#:package Serilog.Sinks.Console@6.0.0
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.CreateLogger();
var myDirectories = Directory.GetDirectories(@"C:\");
foreach (var dir in myDirectories)
{
Log.Information("Found directory: {Directory}", dir);
}
Về Project Properties thì sao?
Đôi khi bạn chỉ định các thứ trong file .csproj, chẳng hạn như phiên bản ngôn ngữ C# hoặc một .NET SDK cụ thể hơn. Bạn cũng có thể làm điều này với file C# riêng lẻ của mình bằng cách thêm các chỉ thị vào file của bạn bắt đầu bằng #:, như các tham chiếu package NuGet từ phần trước của bài đăng blog này bắt đầu bằng #:package.
Để tham chiếu một SDK cụ thể, ví dụ SDK Web để xây dựng một minimal API, bạn sử dụng chỉ thị #:sdk. Trong đoạn code bên dưới, bạn thấy một file Program.cs chứa code đầy đủ cho một minimal API đơn giản. Lưu ý chỉ thị #:sdk ở đầu. Theo mặc định, implicit usings cũng được bật, có nghĩa là không cần chỉ thị using để sử dụng lớp WebApplication.
#:sdk Microsoft.NET.Sdk.Web
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello from Web API from simple C# file");
app.Run();
Cũng có thể chỉ định các thuộc tính MSBuild khác với chỉ thị #:. Nếu bạn muốn sử dụng ví dụ phiên bản preview của C# trong file của mình, bạn có thể sử dụng chỉ thị bên dưới để đặt thuộc tính LangVersion thành giá trị preview:
#:property LangVersion preview
Bạn tìm thấy nhiều chỉ thị hơn và thậm chí hỗ trợ để xây dựng các shell script có thể thực thi với C# trong bài đăng blog .NET này.
Nếu bạn cần một Project File thì sao?
Bất cứ khi nào bạn đạt đến điểm với file C# riêng lẻ của mình mà bạn cần một file .csproj, bạn có thể chạy lệnh sau để chuyển đổi file C# riêng lẻ của bạn thành một project với file .csproj:
dotnet project convert Program.cs
Lệnh này sẽ hỏi bạn về thư mục đầu ra cho project. Sau đó, nó sẽ tạo file .csproj tương ứng cho bạn trong thư mục đầu ra đó. File .csproj này sẽ bao gồm tất cả các tham chiếu package NuGet, thuộc tính MSBuild và SDK được chỉ định mà bạn đã bao gồm trong file C# của mình với các chỉ thị #:. Nó cũng sẽ bao gồm chính file C#, nhưng bây giờ không có các chỉ thị #:, vì tất cả thông tin đó hiện là một phần của file .csproj.
Hãy lấy file Program.cs bên dưới mà chúng ta đã sử dụng trong bài đăng blog này làm ví dụ.
#:package Serilog@4.3.0
#:package Serilog.Sinks.Console@6.0.0
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.CreateLogger();
var myDirectories = Directory.GetDirectories(@"C:\");
foreach (var dir in myDirectories)
{
Log.Information("Found directory: {Directory}", dir);
}
File Program.csproj được tạo chứa các tham chiếu package NuGet tương ứng cho Serilog mà tôi đã định nghĩa trong file C# với các chỉ thị #:package.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
</ItemGroup>
</Project>
File Program.cs đã được dọn dẹp và không chứa bất kỳ chỉ thị #: nào nữa. Nó trông như bên dưới.
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.CreateLogger();
var myDirectories = Directory.GetDirectories(@"C:\");
foreach (var dir in myDirectories)
{
Log.Information("Found directory: {Directory}", dir);
}
Điều này có nghĩa là bây giờ, trong thư mục MyProgram, bạn có thể chỉ chạy dotnet run như bạn đã có thể với các phiên bản .NET trước đó, và .NET CLI sẽ lấy file .csproj từ thư mục đó và thực thi project tương ứng hoặc file .exe được tạo ra từ project.
Tóm tắt
Tính năng mới này của .NET 10 để thực thi các file trực tiếp mà không cần file .csproj rõ ràng là rất mạnh mẽ. Nó có nghĩa là C# hiện là lựa chọn hợp lệ cho bất kỳ script nào mà trước đây bạn đã triển khai với PowerShell, Python hoặc bất kỳ ngôn ngữ nào khác.
Nó cũng có nghĩa là những người mới bắt đầu với C# có thể bắt đầu với một file C# sạch, và không cần gì khác. Ở giai đoạn sau, họ có thể đi sâu vào các file .csproj.
Cảm ơn bạn đã đọc,
Thomas



