【.NET 10】C# がスクリプト言語になった? dotnet run script.cs で NuGet パッケージごと即実行できる新機能を試してみた
はじめに
Python では PEP 723 により、スクリプトファイル内に依存パッケージを記述して uv run で即座に実行できる仕組みが広がっています。
# /// script
# dependencies = ["requests"]
# ///
import requests
print(requests.get("https://example.com").status_code)
「C# でもこれができたらな…」 と思ったことはありませんか?
.NET 10 で正式に導入された 「File-based Apps(ファイルベースアプリ)」 機能を使えば、.csproj なし・dotnet new なし・bin/obj なしで、C# ファイル 1 枚を書いて即実行できます。しかも NuGet パッケージのインライン指定まで対応しています。
実際に手元で検証してみたので、その結果を共有します。
対象読者
- Python や Deno の「1 ファイル完結」に慣れている方
- C# を使い捨てスクリプトとして活用したい方
- .NET 10 の新機能に興味がある方
環境
- .NET SDK: 10.0.103
- OS: Ubuntu 24.04 (WSL2)
検証: NuGet パッケージをインラインで指定して実行
スクリプトの作成
以下の内容で script.cs を作成します。たったこれだけです。
#:package Newtonsoft.Json@13.0.3
using Newtonsoft.Json;
var obj = new { Name = "Antigravity", Feature = ".NET 10 Single File Execution" };
Console.WriteLine(JsonConvert.SerializeObject(obj));
ポイントは 1 行目の #:package ディレクティブです。
#:package パッケージ名@バージョン
この記法で、ソースファイル内に NuGet パッケージの依存を宣言できます。Python の PEP 723 における # /// script ブロックに相当する機能です。
実行
$ dotnet run script.cs
{"Name":"Antigravity","Feature":".NET 10 Single File Execution"}
動きました! dotnet restore も dotnet new も一切不要です。
ディレクトリの確認
実行後、ディレクトリの中身を確認してみます。
$ ls -la
total 12
drwxr-xr-x 2 takuma takuma 4096 Feb 22 23:00 .
drwxr-xr-x 7 takuma takuma 4096 Feb 22 23:00 ..
-rw-r--r-- 1 takuma takuma 193 Feb 22 23:02 script.cs
bin/ も obj/ も生成されていません。 ファイル 1 枚だけでディレクトリがクリーンなまま実行できています。
何がうれしいのか
1. プロジェクトの「儀式」が不要に
従来の C# で「ちょっと試したい」ときの手順:
dotnet new console -o MyScript
cd MyScript
dotnet add package Newtonsoft.Json
# Program.cs を編集
dotnet run
File-based Apps なら:
# script.cs を書く
dotnet run script.cs
4 ステップが 1 ステップに短縮されます。
2. ディレクトリが汚れない
従来は bin/、obj/、.csproj、*.sln などがディレクトリに散らかりますが、File-based Apps ではソースファイル 1 枚しか存在しません。裏側の一時領域でコンパイルが行われるため、作業ディレクトリは完全にクリーンです。
3. 共有が圧倒的に簡単
この .cs ファイルを 1 枚 Slack や GitHub Gist に貼るだけで、受け取った側は dotnet run script.cs で依存関係ごと同じ環境を再現して即座に実行できます。
4. 使い捨てスクリプトに最適
- JSON データの加工・変換
- API へのワンショットリクエスト
- ファイルのバッチ処理
- ちょっとしたライブラリの動作確認
これらの用途で、わざわざプロジェクトを作る必要がなくなります。
Python (PEP 723) との比較
| Python (PEP 723) | C# (.NET 10) | |
|---|---|---|
| 依存宣言の書き方 |
# /// script ブロック内に TOML |
#:package Name@Version |
| 実行コマンド | uv run script.py |
dotnet run script.cs |
| 型安全性 | なし(動的型付け) | あり(静的型付け) |
| IDE 補完 | 限定的 | VS Code + C# Dev Kit で完全対応 |
| 標準化状況 | PEP 723 として標準化済み | .NET 10 で正式導入 |
| 中間ファイル | なし | なし(bin/obj 生成されない) |
注意点
現時点では単一ファイル(.cs 1 枚)のみの対応です
複数ファイルへの分割は .NET 11 以降で対応が検討されています。大規模なツールに育てたい場合は、dotnet project convert script.cs で通常のプロジェクト構成に変換できます。
まとめ
.NET 10 の File-based Apps 機能により、C# でも Python のように 「ファイル 1 枚書いて、依存パッケージごと即実行」 が可能になりました。
#:package Newtonsoft.Json@13.0.3 と 1 行書くだけで NuGet パッケージが自動解決され、bin/obj も生成されず、ディレクトリはクリーンなまま。これまで Python や Bash に逃げていた「ちょっとしたスクリプト」の用途を、型安全な C# で書けるようになる大きな一歩です。
参考記事
※この記事の文章は、Antigravityで作成したベースをもとに、筆者が構成・加筆したものです。