วิธีรันไฟล์ C# โดยตรงด้วย `dotnet run app.cs`
(devblogs.microsoft.com)- ตั้งแต่ .NET 10 Preview 4 เป็นต้นไป ได้เพิ่มความสามารถในการรันไฟล์ C# เดี่ยวได้ทันทีด้วย
dotnet run app.csทำให้สามารถรันโค้ด C# ได้แม้ ไม่มีไฟล์โปรเจ็กต์ - ด้วย file-based apps การรันสคริปต์แบบง่าย การทดสอบ และการลองไอเดียจึงทำได้สะดวกขึ้นมาก คล้ายกับ Python หรือ JavaScript
- ยังสามารถจัดการ การอ้างอิงแพ็กเกจ NuGet, การระบุ SDK, การตั้งค่า build properties ผ่าน directive ภายในไฟล์ได้ ช่วยเพิ่มความยืดหยุ่นในการพัฒนา
- รองรับ shebang จึงนำไปใช้กับ CLI utility หรือสคริปต์อัตโนมัติบนระบบตระกูลยูนิกซ์ได้
- หากต้องการ ยังสามารถแปลงเป็น แอปแบบอิงโปรเจ็กต์ ได้อย่างลื่นไหล ทำให้เชื่อมต่อจากการเรียนรู้และการทำต้นแบบไปสู่การพัฒนาแอปจริงได้อย่างเป็นธรรมชาติ
dotnet run app.cs คืออะไร
- เดิมที หากต้องการรันโค้ด C# ด้วย
dotnetCLI จะต้องมีโครงสร้าง โปรเจ็กต์ (.csproj) เสมอ - ตอนนี้สามารถรันได้ทันทีด้วยไฟล์ .cs เดี่ยว เพียงไฟล์เดียว ทำให้ลดอุปสรรคในการเริ่มต้นลงอย่างมาก
- เหมาะกับการใช้งานหลากหลาย เช่น ภาษาสคริปต์ งานอัตโนมัติ การทดลอง และการเรียนรู้
- ด้วยการ ผสานรวมกับ CLI จึงใช้งานได้ทันทีหากมี dotnet โดยไม่ต้องติดตั้งเครื่องมือเพิ่ม
- เมื่อโค้ดใหญ่ขึ้น ก็สามารถขยายไปเป็นแอปแบบอิงโปรเจ็กต์ได้ด้วยภาษาและเครื่องมือชุดเดิม
รองรับ directive ระดับไฟล์
- ใน file-based apps ก็สามารถประกาศการตั้งค่าหลักของโปรเจ็กต์เป็น directive ภายในไฟล์ .cs ได้โดยตรง
-
การอ้างอิงแพ็กเกจ NuGet
- สามารถอ้างอิง แพ็กเกจ NuGet ได้ทันทีด้วย directive
#:package- ตัวอย่าง:
#:package Humanizer@2.14.1 using Humanizer; var dotNet9Released = DateTimeOffset.Parse("2024-12-03"); var since = DateTimeOffset.Now - dotNet9Released; Console.WriteLine($"It has been {since.Humanize()} since .NET 9 was released.");
- ตัวอย่าง:
- สามารถอ้างอิง แพ็กเกจ NuGet ได้ทันทีด้วย directive
-
การระบุ SDK
- สามารถระบุ ประเภทของ SDK ได้ด้วย directive
#:sdk- ตัวอย่าง:
#:sdk Microsoft.NET.Sdk.Web - ยังสามารถเปิดใช้ความสามารถของ ASP.NET Core (minimal API, MVC เป็นต้น) ได้ด้วย
- ตัวอย่าง:
- สามารถระบุ ประเภทของ SDK ได้ด้วย directive
-
การตั้งค่า MSBuild properties
- สามารถระบุ build properties ได้โดยตรงด้วย
#:property- ตัวอย่าง:
#:property LangVersion preview
- ตัวอย่าง:
- สามารถระบุ build properties ได้โดยตรงด้วย
-
รองรับ shebang สำหรับเชลล์สคริปต์
- ใส่
#!/usr/bin/dotnet runไว้บนสุดของไฟล์ เพื่อใช้งานเป็น ไฟล์รันได้โดยตรงบนระบบตระกูลยูนิกซ์- ตัวอย่าง:
#!/usr/bin/dotnet run Console.WriteLine("Hello from a C# script!"); - ให้สิทธิ์รันแล้วใช้งานได้ทันที:
chmod +x app.cs ./app.cs
- ตัวอย่าง:
- ใส่
การแปลงเป็นแอปแบบอิงโปรเจ็กต์
- เมื่อแอปมีขนาดใหญ่ขึ้นหรือจำเป็นต้องใช้ความสามารถเพิ่มเติม สามารถแปลงเป็น โปรเจ็กต์ได้อย่างง่ายดาย ด้วยคำสั่ง
dotnet project convert app.cs - directive จะถูกแปลงเป็น properties, references ฯลฯ ในไฟล์ .csproj โดยอัตโนมัติ
-
ตัวอย่างการแปลง
- ไฟล์ตัวอย่างด้านล่าง:
#:sdk Microsoft.NET.Sdk.Web #:package Microsoft.AspNetCore.OpenApi@10.*-* var builder = WebApplication.CreateBuilder(); builder.Services.AddOpenApi(); var app = builder.Build(); app.MapGet("/", () => "Hello, world!"); app.Run();
- ไฟล์ตัวอย่างด้านล่าง:
-
- ผลลัพธ์หลังแปลง:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.*-*" /> </ItemGroup> </Project>
ความแตกต่างจากแนวทาง C# script แบบเดิม
- ก่อนหน้านี้แม้จะสามารถรัน C# script ได้ด้วยเครื่องมือจากชุมชน เช่น CS-Script, dotnet-script, Cake เป็นต้น แต่จำเป็นต้องติดตั้งและตั้งค่าเครื่องมือแยกต่างหาก
- ตอนนี้สามารถใช้ คอมไพเลอร์และภาษา C# ชุดเดียวกันได้เลยโดยไม่ต้องติดตั้งเพิ่มหรือเข้าโหมดพิเศษ ทำให้รันโค้ดได้ทันทีโดยแทบไม่มีอุปสรรค
วิธีเริ่มต้น
- ติดตั้ง .NET 10 Preview 4
- หากใช้ Visual Studio Code ต้องติดตั้ง C# Dev Kit และ ส่วนขยาย C# เวอร์ชันพรีรีลีสล่าสุด (2.79.8 ขึ้นไป)
- สร้างไฟล์
.csแล้วเขียนโค้ดได้ทันที - รัน
dotnet run hello.csในเทอร์มินัล - หากต้องการ สามารถแปลงเป็นโปรเจ็กต์ด้วย
dotnet project convert hello.cs
อ่านเพิ่มเติม
แผนในอนาคต
- มีแผนเพิ่มการรองรับ file-based apps ใน VS Code และปรับปรุง IntelliSense สำหรับ directive รวมถึงประสิทธิภาพและการดีบัก
- กำลังพัฒนาความสามารถเพิ่มเติม เช่น รองรับหลายไฟล์ และการปรับปรุงความเร็วในการรัน
dotnet run app.csช่วยให้เข้าถึง C# ได้ง่ายขึ้น โดยยังคงมอบพลังของ .NET ไว้อย่างครบถ้วน- เป็นพื้นฐานที่ช่วยให้เปลี่ยนผ่านจากการทำต้นแบบ การศึกษา ไปจนถึงการพัฒนาโปรดักชันได้รวดเร็วยิ่งขึ้น
4 ความคิดเห็น
ประสบการณ์ DX ที่ให้การเติมโค้ดอัตโนมัติบนพื้นฐาน File-based App มีให้ใช้งานอยู่แล้วใน C# extension เวอร์ชันล่าสุด แต่เดิม Microsoft ไม่ได้เผยแพร่ส่วนขยายนี้นอกเหนือจาก VS Code Marketplace
เพื่อแก้ความไม่สะดวกนี้ จึงได้แยกเฉพาะส่วน C# Extension ของ C# Dev Kit (ส่วนที่ใช้ไลเซนส์ MIT) มาทำ autobuild/auto-publish แยกต่างหากและลงทะเบียนไว้บน OpenVSX พร้อมแชร์วิดีโอเดโมสั้น ๆ ที่อิงกับ Kiro ตามนี้
https://www.youtube.com/watch?v=pIi7CWOPQSA
ตอนที่ก่อนหน้านี้ผมเคยใช้ฟีเจอร์ C# Interactive แพ็กเกจที่ไม่ได้ติดตั้งไว้ในเครื่องจะใช้งานไม่ได้ แต่ดูเหมือนว่าตอนนี้มันถูกปรับปรุงแล้วนะครับ
ความคิดเห็นจาก Hacker News
npm run <command>go run github.com/kardianos/json/cmd/jsondiff@v1.0.1ซึ่งเป็นฟีเจอร์ที่เจ๋งมากdotnet runนั้นแคชผลการคอมไพล์ให้อยู่แล้ว จึงไม่ต้องมี caching layer เพิ่มเติม (ถ้าจะปิดใช้ให้ใส่--no-buildและถ้าจะดู path ของไบนารีให้ใช้--artifacts-path)*.main.ktsเท่านั้นถึงจะทำงาน) แนวทางแบบนี้เหมาะมากกับสคริปต์เล็ก ๆ หรือการทำต้นแบบ และก็ใช้งานความสามารถของ JVM ได้จริงจังด้วย แต่สำหรับสคริปต์เล็ก ๆ Ruby ก็ยังสะดวกที่สุด โดยเฉพาะเวลาเรียกโปรแกรมภายนอกที่ไวยากรณ์ backtick ใช้ง่ายมากdotnet run <file>ใช้งานได้ พออัปเดตก็ใช้งานได้ตามปกติ สาเหตุคือไฟล์ใช้การขึ้นบรรทัดใหม่แบบ CRLF แทน LF#!/usr/local/share/dotnet/dotnet runหรือ#!/usr/bin/env -S dotnet runใน shebang.dump()ส่วนdotnet runตัวนี้น่าจะเป็นเครื่องมือที่เข้ามาเติมเต็มมากกว่า เมื่อก่อนเคยอยู่ในที่ที่เกลียด PowerShell มากและใช้ LINQPad ทำงานสคริปต์แทบทั้งหมด ซึ่งในบริบทแบบนั้นมันก็ใช้ได้ดีdotnet runใน VSCode หรือ Visual Studio จะใกล้เคียงกับ LINQPad แค่ไหน จุดเด่นของ LINQPad คือการแสดงผลลัพธ์แบบภาพ ถ้าdotnet runแสดงได้แค่ข้อความหรือจำเป็นต้องมีปลั๊กอินเพิ่มเยอะ ความต้องการ LINQPad ก็คงยังอยู่ แต่ถ้าต้องการแค่เช็กไวยากรณ์อะไรบางอย่างdotnet runอาจเป็นตัวเลือกที่ดีกว่า ผมเองก็บางครั้งลองไวยากรณ์ที่ไม่แน่ใจใน LINQPad เหมือนกันผมได้ลองทำตัวอย่างใช้งานจริงที่เกี่ยวกับฟีเจอร์นี้ไว้ 2 ตัวอย่าง เลยมาแชร์ไว้ในคอมเมนต์ตอบกลับครับ เป็นโค้ดตัวอย่างแอป GUI สำหรับ Windows และ macOS ที่ใช้ MCP server และ Avalonia 😊
https://forum.dotnetdev.kr/t/…