VisualStudioCode + C# で .NET6のコンソールアプリを作成する
.NET6のコンソールアプリ を ChromeBook にインストールしたVisualStudioCode(以下VSCode)を使って、C#で作成していきます。
定形作業をバッチ化していく場合、WindowsならDOSコマンドやPowerShell、Linuxならばbashなどのshellでといった具合に言語を使い分けたりする必要もあったりしますが、.NET6であればランタイムがインストールされている任意のプラットフォームで実行するアプリを、C#だけでつくることができます。
この記事では VisualStudioCode + C# で、フレームワークとしてCysharp/ConsoleAppFrameworkを使って、キーボードからYes/Noの入力待ちを受け付けるところまでを作成していきます。
この記事の前提条件
- ChromeBook で開発する
- ChromeBook には VSCode がインストールされている
- フレームワークとして
Cysharp/ConsoleAppFrameworkを使用する
ChromeBook への VSCode のインストールは、次の記事を参考にしてください。
.NET SDKをインストールする
.NET アプリの開発には SDK が必要なので、公式の手順でChromeBookに.NET SDKをインストールします。
記事を書いている時点では、私のChromeBookはDebian11だったので、公式のDebian11の手順でリポジトリとSDKをインストールしました。
- パッケージリポジトリを追加する
wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
- SDKをインストールする
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-6.0
- インストールされたことを確認する
dotnet --list-sdks
次のように表示されます
6.0.401 [/usr/share/dotnet/sdk]
VSCodeにプラグインをインストールする
次の記事を参考させてもらい、C#の開発に必要なプラグイン、あると便利なプラグインをインストールしていきます。
今回は以下のものをインストールしました。
- C#
- VS Sharper for C#
- Auto-Using for C#
- .NET Core Test Explorer
- Bookmarks
- NuGet Package Manager
- NuGet Reverse Package Search
- NuGet Gallery
dotnetコマンドでテンプレートからコンソールアプリを作成
ひとまずテンプレートから、作成するアプリの雛形をつくります。
dotnetコマンドを使って、公式の手順でテンプレートから開発のベースとなるコンソールアプリを作成します。
ターミナルを開き、作業用のディレクトリで以下のコマンドを実行します。
dotnet new console -o "SampleConsole"
code SampleConsole
実行すると VSCode が起動して、右下あたりにメッセージが表示され、ビルドやデバッグに必要なファイルの追加を促されますのでYesを選択します。
これにより F5に相当するキー(「虫眼鏡キー+数字の5かデスク切り替えキー」や「Windowsキー+F5」)で ビルドと実行ができるようになります。

実行すると デバッグコンソールにHello wolrdが表示されます。
リリースビルドをつくる
IDEとして Visual Studio を使ってるのならばメニューからリストで選んでリリースビルドを作ることもできますが、VSCodeの場合 tasks.json を編集したりする必要があるので、ひとまず公式の内容を参考にして dotnetコマンドでリリースビルドをつくってみます。
- VSCodeで 表示→ターミナル
- dotnetコマンドでリリースビルドを実行
dotnet publish --configuration Release
プロジェクトフォルダのbin/Release/net6.0/publishに実行に必要なファイルが出力されます。
SampleConsoleアプリを作成した場合、dotnet SampleConsole.dllで、.NET ランタイムがインストールされている任意のプラットフォームで実行させることができます。
出力されるファイルについては、公式のドキュメントを読んでください。
ConsoleAppFrameworkのインストール
コンソールアプリ作成のためのnugetパッケージとしてCysharp/ConsoleAppFrameworkをインストールします。
インストールしていたNuGet Galleryでインストールしていきます。
- 表示→コマンドパレット
-
nugetと入力し、Open Nuget Gallery を選択 - ConsoleAppFrameworkを検索してインストール
コンソールアプリの編集
公式のドキュメントを参考にConsoleAppFrameworkを使ってアプリを編集していきます。
ConsoleAppFrameworkではクラスのPublicメソッドをコマンドとして登録できるのでConsoleAppBaseを継承したクラスを作成し、コマンドを追加していきます。
また[RootCommand]属性を持つメソッドをデフォルトのコマンドとして登録できます。
var app = ConsoleApp.Create(args);
app.AddCommands<Foo>();
app.Run();
public class Foo : ConsoleAppBase
{
[RootCommand]
public void Hello()
{
Console.WriteLine("Hello, World!");
}
public void Sum([Option(0)]int x, [Option(1)]int y)
{
Console.WriteLine((x + y).ToString());
}
}
VSCodeからF5でデバッグ実行、あるいはdotnetコマンドでdotnet SampleConsole.dllのように実行するとデフォルトコマンドのHelloが実行され、デバッグコンソールにHello wolrdが表示されます。
Sumコマンドを実行するには、パラメータとしてサブコマンドの名前を渡して実行します。
dotnet SampleConsole.dll sum 1 3
4
Yes/Noの入力待ちの受付
ここでは[RootCommand]をYesOrNoメソッドとし、キーボードからYes/Noの入力待ちを受け付ける処理を作成します。
キーボードのYキーが押されたら処理開始のメッセージを、Nキーが押されたら処理終了のメッセージを、それ以外のキー入力は無視するようにします。デフォルトをNキーとし、エンターのみ押された場合はNキーと同様の処理をします。
また、エスケープキーが押された場合は強制終了とし、これもNキーと同様の処理をすることにします。ただし、エスケープキーの場合はエコーバックはおこなわないでおきます。
[RootCommand]
public void YesOrNo()
{
Console.WriteLine("処理を開始していいですか?");
Console.WriteLine(" [y,N] ");
ConsoleKeyInfo cki;
do {
while (Console.KeyAvailable == false){
Thread.Sleep(250);
}
cki = Console.ReadKey(true);
if ( (cki.Key == ConsoleKey.N) || (cki.Key == ConsoleKey.Enter) ){
Console.WriteLine("N");
Console.WriteLine("処理を終了します");
return;
} else if (cki.Key == ConsoleKey.Escape){
return;
}
} while(cki.Key != ConsoleKey.Y);
Console.WriteLine("処理を開始します");
return;
}
ユーザーから押されたキーを取得するにはConsole.ReadKeyメソッドを使います。ただし、Console.ReadKeyメソッドを呼び出すとキーが押されるまで処理をブロックしてしまうので、Console.KeyAvailableプロパティを使ってキーが押されるまで待つ、キー待ちループを作ります。Console.KeyAvailableプロパティは、入力をブロックせずに値をすぐに返します。
まとめ
本記事では ChromeBook にインストールした VSCode で 基本のキー入力を伴うC#のコンソールアプリを作成しました。
アウトプットを出す場合には「やり始める」というハードルを超えることが一番重要なのではないかなと思っているのですが「どうやってやるんだっけ」「どこから手をつければいいんだっけ」でつまづいて、最初のハードルを超えられずに何も始まらないということが、私の場合はよくあります。
特に定形作業を自動化するといったことは、面倒な作業を楽にしたいというところから生まれてくると思うのですが、その作業をやり始めるのが面倒であると結果的に面倒を乗り越えるための作業が面倒で、慣れた面倒な作業を面倒だけど続けてしまうということになってしまうのではないかと思います。
多くの環境で比較的簡単に動かしやすく、使い回しのきくC#で定形処理を書いていくことで最初のハードルを超えやすくなるのではないかなと思いました。
参考
- GitHub - Cysharp/ConsoleAppFramework: Micro-framework for console applications to building CLI tools/Daemon/Batch for .NET Core, C#.
- neue cc - ConsoleAppFramework - .NET Coreコンソールアプリ作成のためのマイクロフレームワーク(旧MicroBatchFramework)
- Console.ReadKey メソッド (System) | Microsoft Learn
- Console.KeyAvailable プロパティ (System) | Microsoft Learn
- ConsoleKeyInfo 構造体 (System) | Microsoft Learn
- ConsoleKey 列挙型 (System) | Microsoft Learn
Discussion