2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【.NET 10】C# がスクリプト言語になった? `dotnet run script.cs` で NuGet パッケージごと即実行できる新機能を試してみた

2
Posted at

【.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 を作成します。たったこれだけです。

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 restoredotnet 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で作成したベースをもとに、筆者が構成・加筆したものです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?