The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

體驗 .NET 10 的超酷新功能:dotnet run app.cs

最近微軟釋出了 .NET 10 Preview 4 版本,這個版本正式推出了一個超酷的新功能,你現在可以在完全沒有 *.csproj 檔案的情況下,直接使用 dotnet run 來執行你的 C# 程式碼!先不論這件事有沒有意義,但這個功能確實會大幅簡化我們的開發流程,讓我們可以更快速地測試和執行 C# 程式碼。今天這篇文章我們就來體驗一下這個全新功能!

image

🚀 什麼是 dotnet run app.cs

現在你可以直接執行單一 C# 檔案,就像執行 Python 或 JavaScript 一樣簡單!不需要 .csproj 檔案,不需要複雜的專案結構,我們馬上來看一下怎樣跑?

  1. 先用 Docker 或 Podman 執行 .NET 10 Preview 4 的 SDK 映像檔:

    docker run --rm -it mcr.microsoft.com/dotnet/sdk:10.0.100-preview.4-noble-amd64
    
  2. 在容器內建立一個 C# 檔案 app.cs

    以下命令會在你的 $HOME 目錄下建立一個名為 app.cs 的 C# 檔案,並寫入一個簡單的 Web API 程式碼範例:

    cat <<EOF > ~/app.cs
    #:sdk Microsoft.NET.Sdk.Web
    #:package Microsoft.AspNetCore.OpenApi@10.*-*
    
    var builder = WebApplication.CreateBuilder();
    builder.Services.AddOpenApi();
    
    var app = builder.Build();
    app.MapOpenApi();
    app.MapGet("/", () => "Hello, world!");
    
    app.Run();
    EOF
    

    注意: 檔名不一定要叫做 app.cs,你可以用任何你喜歡的名稱。

  3. 接著在容器內執行這個 C# 檔案:

    dotnet run ~/app.cs
    

    然後一個包含 OpenAPI 規格的 Web API 站台就啟動了!

    image

  4. 接著將該檔案加入執行權限並重新執行:

    chmod +x ~/app.cs
    
    ~/app.cs
    

    這樣就可以直接當成 C# 腳本執行了!😍

  5. 如果想要轉成完整的 .NET 專案,只需要執行以下命令:

    cd ~
    dotnet project convert app.cs
    

    這個命令會自動:

    • 建立一個新的專案目錄
    • 建立一個 app.csproj 專案檔
    • app.cs 搬移到專案目錄中
    • 移除所有 #:#! 開頭的語法

    Image

✨ 關於 dotnet run app.cs 的三大亮點

我認為這個全新的功能有三大亮點:

  1. 零門檻開始

    無論是新手學習、實驗、小型腳本都超方便,不需要任何專案設定檔或複雜的環境配置,而且這份 C# 原始碼還能夠跨平臺執行。

  2. CLI 原生支援

    執行環境只需要安裝 .NET SDK 就可以開始跑,你真的就只要有 .cs 檔案即可,尤其是在 Linux/macOS 環境下,真的就超方便!

  3. 無痛升級

    程式碼長大後,可以輕鬆轉成完整專案,這樣就可以享受完整的 .NET 生態系統,包括 NuGet 套件、除錯、測試等功能。

🎯 全新的檔案層級指令

全新的 dotnet run app.cs 擴充了幾個檔案層級指令 (directive),讓你可以更方便地管理你的 C# 腳本:

  • #:package 引用 NuGet 套件

    #:package Humanizer@2.14.1
    
    using Humanizer;
    var dotNet9Released = DateTimeOffset.Parse("2024-12-03");
    var since = DateTimeOffset.Now - dotNet9Released;
    Console.WriteLine($"距離 .NET 9 發布已經 {since.Humanize()}");
    
  • #:sdk 指定 SDK

    如果要建立 Console 或 Windows Forms 應用程式,不用特別添加 #:sdk 指令。但你想建立 Web API 就要特別加上:

    #:sdk Microsoft.NET.Sdk.Web
    
  • #:property 設定 MSBuild 屬性

    #:property LangVersion preview
    
  • 支援 Shebang 腳本

    在 Unix 系統上能夠直接執行:

    #!/usr/bin/dotnet run
    Console.WriteLine("來自 C# 腳本的問候!");
    

    但要特別注意一點,就是 Shebang 不支援 Unicode 的 BOM (Byte Order Mark) 字元,所以如果你的檔案有 BOM 的話,執行時會出現問題。

    $ ./app.cs
    ./app.cs: line 1: #!/usr/bin/dotnet: No such file or directory
    ./app.cs: line 4: syntax error near unexpected token `('
    ./app.cs: line 4: `var builder = WebApplication.CreateBuilder();'
    

🔮 未來展望

微軟正在努力改善以下幾點特性:

  • 多檔案支援
  • 提供偵錯功能
  • 更快的執行效能
  • VS Code 的 IntelliSense 支援

我自己是認為 Visual Studio 2022 應該不會特別支援這種類型的偵錯,也確實沒多大必要性,因為這個功能主要是針對快速原型開發小型腳本而設計的。如果你覺得不是太重要的話,倒是可以不用太在意這個全新的特性。如果有什麼想知道的,可以到.NET SDK 的 GitHub Repo 查看問題或給予回饋!

⚒ 分享一個 .NET MCP 範例

我在測試這個功能時,寫了一個簡單的 MCP (Model Context Protocol) 範例,寫完之後覺得真的帥,一個 C# 檔案就可以完成整個 MCP 工具的開發,不但可以看到程式碼、可以隨時改,重點還不用煩惱編譯與部署的問題,在本機執行 MCP 工具超便利!

  1. 首先,建立一個名為 app.cs 的 C# 檔案:

    mkdir -p /home/vscode/projects/echo-mcp
    touch /home/vscode/projects/echo-mcp/app.cs
    chmod +x /home/vscode/projects/echo-mcp/app.cs
    

    檔案內容如下:

    #!/usr/bin/dotnet run
    
    #:sdk Microsoft.NET.Sdk
    #:property TargetFramework net10.0
    #:package Microsoft.Extensions.Hosting 10.*-*
    #:package ModelContextProtocol 0.2.0-preview.2
    
    using System.ComponentModel;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using ModelContextProtocol.Server;
    
    var builder = Host.CreateEmptyApplicationBuilder(settings: null);
    
    builder.Services
        .AddMcpServer()
        .WithStdioServerTransport()
        .WithToolsFromAssembly();
    
    Console.WriteLine("Starting MCP Echo Server...");
    
    await builder.Build().RunAsync();
    
    [McpServerToolType]
    public static class EchoTool
    {
        [McpServerTool, Description("Echoes the message back to the client.")]
        public static string Echo(string message) => $"Hello from C#: {message}";
    }
    
  2. 提供 GitHub Copilot 一個 .vscode/mcp.json 設定檔

    {
        "servers": {
            "echo": {
                "type": "stdio",
                "command": "/home/vscode/projects/echo-mcp/app.cs"
            }
        }
    }
    

    Image

  3. 接著就可以直接從 GitHub Copilot 呼叫這個 MCP 工具了,是不是很帥!😄

    Image

相關連結

留言評論