- .NET 10 Preview 4 から、単一の C# ファイルを
dotnet run app.cs でそのまま実行できる機能が追加され、プロジェクトファイルなしでも C# コードを実行可能になった
- ファイルベースのアプリ(file-based apps) により、Python や JavaScript のような簡単なスクリプト実行、テスト、アイデア実験がより手軽になった
- NuGet パッケージ参照、SDK 指定、ビルドプロパティ設定 などもファイル内の ディレクティブ で管理でき、開発の柔軟性が向上
- shebang 対応により、Unix 系で CLI ユーティリティや自動化スクリプトにも活用可能
- 必要に応じて プロジェクトベースのアプリ にスムーズに変換でき、学習やプロトタイプから本格的なアプリ開発まで自然につなげられる
dotnet run app.cs とは何か
- 従来は
dotnet CLI で C# コードを実行するには、必ず プロジェクト(.csproj) 構成が必要だった
- 今では単一の .cs ファイル だけでそのまま実行できるため、参入障壁が大きく下がった
- スクリプト言語的な用途、自動化、実験、学習などさまざまな用途に適している
- CLI 統合 により、追加ツールのインストールなしで dotnet さえあればすぐ使える
- コードが大きくなっても、同じ言語とツールでプロジェクトベースのアプリへ拡張できる
ファイルレベルのディレクティブ対応
- ファイルベースのアプリでも、プロジェクトの主要設定を .cs ファイル内のディレクティブ として直接宣言できる
-
NuGet パッケージ参照
#:package ディレクティブで NuGet パッケージ をそのまま参照できる
-
SDK 指定
#:sdk ディレクティブで SDK の種類を指定 できる
-
MSBuild プロパティ設定
#:property でビルドプロパティを直接指定できる
-
シェルスクリプト向け shebang 対応
- ファイルの先頭に
#!/usr/bin/dotnet run を入れることで、Unix 系で実行ファイル としてそのまま利用できる
プロジェクトベースのアプリへの変換
従来の C# スクリプト方式との違い
- これまでもコミュニティツール(CS-Script、dotnet-script、Cake など)で C# スクリプトの実行は可能だったが、別途ツールのインストールや設定が必要だった
- 今では 追加インストールや専用モードなしで同じ 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 でプロジェクトへ変換
さらに詳しく
今後の計画
- VS Code 内でのファイルベースアプリ対応 や ディレクティブ向け IntelliSense の改善、パフォーマンス向上、デバッグ対応の強化を予定
- 複数ファイル対応 や実行速度の改善など、追加機能も開発中
dotnet run app.cs は C# をより手軽に使えるようにしつつ、.NET の強力さをそのまま提供する
- プロトタイピング、教育、プロダクション開発まで、より素早く移行できる基盤を提供する
4件のコメント
最新バージョンの C# 拡張機能では、File-based App ベースの自動補完体験を提供する DX が用意されていますが、もともと Microsoft は VS Code Marketplace 以外の場所に拡張機能を公開していませんでした。
こうした不便さを解消するために、C# Dev Kit ではない C# Extension 部分(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のようにタグを直接指定して一発で実行できるようになっていて、かなり良い機能だ--no-build、バイナリの場所を確認するには--artifacts-pathを使う*.main.ktsでないと動かない)。こういう方式は小さなスクリプトやプロトタイピングにとても良く、JVM の機能を活用するうえでも実用的だ。それでも小さなスクリプトには Ruby が今でもいちばん使いやすく、特に外部プログラムを実行するときのバッククォート構文が本当に便利だdotnet run <file>では動き、更新後は正常に動作した。原因はファイルが LF ではなく CRLF の改行を使っていたことだった#!/usr/local/share/dotnet/dotnet runあるいは#!/usr/bin/env -S dotnet runを書く必要がある.dump()で値を調べることだ。今回の dotnet run はむしろそれを補完するツールとして使えそうだ。以前、PowerShell を極端に嫌う現場で LINQPad でほぼすべてのスクリプト処理をしていたことがあり、そういう環境では役に立ったこの機能に関連する実際のサンプルを2つ作ってみたので、返信で共有します。MCPサーバーとAvaloniaを使ったWindows、macOS向けGUIアプリのサンプルコードです。😊
https://forum.dotnetdev.kr/t/…